Kaggle tensorflow2.0 解決手寫數字體識別問題

Kaggle tensorflow2.0 解決手寫數字體識別問題

代碼

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras import layers
import csv

# 正好用tensorflow練手重寫一下kaggle上面的手寫數字識別
# 1.load data
train_data = []
train_label = []
openfile = open('./dataset/minist/train.csv','r')
reader = csv.reader(openfile)
for line in reader:
    train_data.append(line)
train_data =np.array(train_data)
train_label = train_data[1:,0]
train_data = train_data[1:,1:]
train_data = np.array(train_data).astype('float')
train_label = np.array(train_label).astype('float')
# print(train_data.shape)
# print(train_label.shape)
test_data = []
openfile = open('./dataset/minist/test.csv','r')
reader = csv.reader(openfile)
for line in reader:
    test_data.append(line)
test_data =np.array(test_data)
test_data = test_data[1:,:]
test_data = np.array(test_data).astype('float')
print(test_data.shape)


# 2.define the model
model = tf.keras.models.Sequential()
model.add(layers.Dense(32,activation='relu'))
model.add(layers.Dense(32,activation='relu'))
model.add(layers.Dense(16,activation='relu'))
model.add(layers.Dense(10,activation='softmax'))
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
              loss=tf.losses.sparse_categorical_crossentropy,
              metrics=['acc'])
history = model.fit(train_data,train_label,epochs=50,batch_size=200)

pred = model.predict(test_data)
pred= np.argmax(pred,axis=1)

print(history)
print(pred)
print(pred.shape)
label =['ImageId','Label']
predd = open("./dataset/minist/sub.csv",'w',newline='')
writer = csv.writer(predd)
writer.writerow(label)
length = len(pred)
for i in range(length):
    predict=[]
    predict.append(i+1)
    predict.append(pred[i])
    writer.writerow(predict)

此次拿測試集來跑,kaggle上面的正確率比knn方法還低了點,只有0.9447。現在的模型是三層隱藏層加一層輸出層,隱藏層的神經元個數分別是32,32,16。後續對神經網絡的結構和超參數進行調整。

調整1

將三層隱藏層改爲兩層,最後一層給我去掉了,所以現在隱藏層神經元個數分別爲32,32
準確率只有0.943了。

調整2

感覺之前是模型過擬合了,這次我把模型調整爲如下:

# 2.define the model
model = tf.keras.models.Sequential()
model.add(layers.Dense(32,activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(32,activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(16,activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(10,activation='softmax'))

即三層隱藏層加一層輸出層,但是每個隱藏層後面加了一個dropout,爲了防止過擬合,但是發現有問題,
這下訓練過程中的準確率就只有0.1了,相當於猜的準確率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章