Keras實現LeNet-5 對mnist數據集進行識別

記錄一下keras代碼學習過程,LeNet-5的網絡結構就不在這裏敘述了,推薦知乎一位大神的講解:https://zhuanlan.zhihu.com/p/74176427.

代碼:
import numpy as np
import matplotlib.pyplot as plt
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Flatten, Dense, Conv2D, MaxPool2D
from keras.utils import to_categorical
from  keras.metrics import categorical_crossentropy



# 導入mnist數據
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 顯示一下數據是否正確
# 首先把訓練集和測試集都轉換成28*28*1的灰白圖片矩陣的形式,方便進行卷積操作
# 整體做歸一化處理
x_train = x_train.reshape(len(x_train), 28, 28, 1) / 255
x_test = x_test.reshape(len(x_test), 28, 28, 1) / 255

# 事實證明 mnist 的labels 是1,2,3這種的,需要轉成one-hot向量
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)


'''
測試一下圖片能否顯示
show_img = np.array(x_train[0], dtype=float).reshape((28, 28))
plt.imshow(show_img)
plt.show()
'''

# 定義一個序列模型
model = Sequential()
# 首先加入第一個卷積層 6組5x5的Filter
# 得到6組 24x24x1的特徵映射
# 本層的輸入既mnist數據集  28x28
model.add(Conv2D(6, kernel_size=(5, 5), activation='relu', input_shape=(28, 28, 1)))
# 加入池化層
model.add(MaxPool2D(pool_size=(2, 2)))
# 再次加入卷積層 本次Filter大小仍然爲5x5
model.add(Conv2D(16, kernel_size=(5, 5), activation='relu'))
# 加入池化層
model.add(MaxPool2D(pool_size=(2, 2)))
# 接入一個FCNN,這裏接入FCNN的原因就是,在本層的輸入是4x4x16 而kernel_size爲5x5,已經不能再進行一次卷積了
# 但是具體如何還是要看一眼 paper, 我只是個菜雞,就不在這裏丟人現眼了QAQ
# 首先將整個數據展開
model.add(Flatten())
model.add(Dense(120, activation='relu'))
model.add(Dense(84, activation='relu'))
# 最後一層定義爲輸出層
model.add(Dense(10, activation='softmax'))


# 最後進行編譯以及預測 使用交叉熵作爲損失函數
# 使用Rmsprop優化器
model.compile(loss=categorical_crossentropy, optimizer='Rmsprop', metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=100, epochs=20, verbose=1, validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test)
print('Final Loss: %f and Final accuracy: %f' % (score[0], score[1]))

但是最後正確率,確實不高(我太菜了。。):
Final Loss: 0.0605986635164 and Final accuracy: 0.9885

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