卷積
卷積(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%
此程序配合之前的手寫板程序即可實現手寫數字識別任務。
大家對程序有任何疑問或建議均可留言,感謝大家支持!!!