Python手寫數字識別——卷積神經網絡訓練model

卷積

卷積(Convolution),也叫摺積,是分析數學中一種重要的運算。在信號處理或圖像處理中,經常使用一維或二維卷積。

卷積神經網絡

卷積神經網絡(Convolutional Neural Network,CNN或ConvNet)是一種具有局部連接、權重共享等特性的深層前饋神經網絡。卷積神經網絡由卷積層、匯聚層和全連接層交叉堆疊而成,利用反向傳播算法進行訓練。卷積神經網絡有三個特性:局部連接、權重共享以及子採樣,這些特性使得卷積神經網絡具有一定程度上的平移、縮放和旋轉不變性,和前饋神經網絡相比,其參數較少。

卷積層

卷積層的作用是提取一個局部區域的特徵,不同的卷積核相當於不同的特徵提取器。由於卷積網絡主要應用在圖像處理上,而圖像爲兩維結構,因此爲了更充分地利用圖像的局部信息,通常將神經元組織爲三維結構的神經層,其大小爲高度 M × 寬度N×深度D,由D個M ×N大小的特徵映射構成。

匯聚層(池化層)

匯聚層(Pooling Layer)也叫子採樣層(Subsampling Layer),其作用是進行特徵選擇,降低特徵數量,從而減少參數數量。池化也稱爲下采樣,主要用於特徵降維,壓縮數據和參數數量,減小過擬合,提高模型的容錯性,常用的有最大池化和平均池化。

全連接層

在卷積神經網絡最後會加一個flatten層,將之前所得到的feature map“壓平”,然後用一個全連接層輸出最後的結果,如果是分類的話,一般會利用softmax激活函數,最後就可以輸出相應的分類結果了。

書寫數字識別model訓練過程

此次卷積神經網絡訓練mnist,使用了3層卷積,1層全連接,激活函數爲 softmax

下載mnist數據集,代碼如下
mnist = keras.datasets.mnist
(x_train,y_train),(x_test,y_test) = mnist.load_data()
第一層卷積
# 一層卷積
model.add(
    Conv2D(
        filters=16,
        kernel_size=(5, 5),
        padding='same',  # 保證卷積核大小,不夠補零
        input_shape=(28, 28, 1),
        activation='relu'))
第一層 池化
# 池化層1
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
第二層卷積和池化
# 二層卷積
model.add(
    Conv2D(filters=32, kernel_size=(5, 5), padding='same', activation='relu'))
# 池化層2
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
第三層卷積和池化層
model.add(
    Conv2D(filters=64, kernel_size=(5, 5), padding='same', activation='relu'))
model.add(
    Conv2D(filters=128, kernel_size=(5, 5), padding='same', activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
全連接層
model.add(Flatten())  # 平坦層
model.add(Dense(128, activation='relu'))  # 全連接層
model.add(Dropout(0.25)) 
model.add(Dense(10, activation='softmax')) # 激活函數
訓練模型
# 訓練模型
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
train_history = model.fit(x=X_train4D_Normalize,
                          y=y_trainOnehot,
                          validation_split=0.2,
                          batch_size=300,
                          epochs=10,
                          verbose=2)

最後的效果還可以,訓練準確率可以達到99%,測試準確率可以達到97%

此程序配合之前的手寫板程序即可實現手寫數字識別任務。

大家對程序有任何疑問或建議均可留言,感謝大家支持!!!

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