在本篇博文當中,筆者採用了卷積神經網絡來對手寫數字進行識別,採用的神經網絡的結構是:輸入圖片——卷積層——池化層——卷積層——池化層——卷積層——池化層——Flatten層——全鏈接層(64個神經元)——全鏈接層(500個神經元)——softmax函數,最後獲得分類的結果。Flatten層用於將池化以後的多個二維數組展開成一維數組,再灌入全鏈接層的神經元當中。數組
首先導包:網絡
import keras from keras import layers from keras import models
創建神經網絡的順序模型:函數
model = models.Sequential()
添加神經網絡的結構(三組卷積層,池化層。一個flatten層,以及兩個全鏈接層),激活函數我通常喜歡使用relu,固然你也可使用sigmoid,tanh這兩個激活函數,更改個人代碼便可。因爲是手寫數字,最後的softmax一共只可以有十個數字,所以輸出寫10.激活函數使用softmax。其餘都是relu。優化
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Flatten()) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(500, activation='relu')) model.add(layers.Dense(10, activation='softmax'))
神經網絡搭建完畢,開始導minist手寫數字,對數字進行分類,分爲訓練集和驗證集,同時將數字進行reshape,代碼以下:lua
from keras.datasets import mnist from keras.utils import to_categorical (train_images, train_labels), (test_images, test_labels) = mnist.load_data() train_images = train_images.reshape((60000, 28, 28, 1)) train_images = train_images.astype('float32') / 255 test_images = test_images.reshape((10000, 28, 28, 1)) test_images = test_images.astype('float32') / 255 train_labels = to_categorical(train_labels) test_labels = to_categorical(test_labels)
緊接着選擇須要進行梯度降低的優化器,常見的有adagrad,adam,rmsprop等等,這裏選擇了rmsprop。損失函數loss function這裏選擇了Cross Entropy,也就是交叉熵(由於最後是一個softmax函數進行分類,咱們經常用交叉熵來衡量模型的準確度,這個計算起來比較方便,也比較有道理)。模型fit的過程中我選擇了mini—batch小批量梯度降低法,用這個方法比較適合電腦,若是使用全部數據進行梯度降低,那麼電腦跑好久纔可以完成,若是使用小批量梯度降低,電腦則能夠自動進行並行計算,時間減小。迭代次數我選擇了10次,每個mini——batch的批量爲128,這個無所謂,這個參數適中便可,不可太大也不能過小。代碼以下:spa
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) model.fit(train_images, train_labels, epochs=10, batch_size=128)
輸出:code
Epoch 1/10 60000/60000 [==============================] - 42s 703us/step - loss: 0.0192 - acc: 0.9940 Epoch 2/10 60000/60000 [==============================] - 42s 706us/step - loss: 0.0166 - acc: 0.9945 Epoch 3/10 60000/60000 [==============================] - 43s 724us/step - loss: 0.0146 - acc: 0.99580s - loss: 0.0145 - acc: 0.9 Epoch 4/10 60000/60000 [==============================] - 43s 720us/step - loss: 0.0129 - acc: 0.9960 Epoch 5/10 60000/60000 [==============================] - 43s 718us/step - loss: 0.0130 - acc: 0.9962 Epoch 6/10 60000/60000 [==============================] - 44s 728us/step - loss: 0.0105 - acc: 0.9966 Epoch 7/10 60000/60000 [==============================] - 44s 737us/step - loss: 0.0095 - acc: 0.9969 Epoch 8/10 60000/60000 [==============================] - 44s 728us/step - loss: 0.0101 - acc: 0.9972 Epoch 9/10 60000/60000 [==============================] - 44s 735us/step - loss: 0.0085 - acc: 0.9974 Epoch 10/10 60000/60000 [==============================] - 45s 743us/step - loss: 0.0081 - acc: 0.99750s - loss: 0.0081 - acc: 0.997
能夠看到模型通過十次迭代,訓練集的準確度已經達到了%99.7以上,這樣會不會出現過擬合的狀況呢?用不用減小一下模型的迭代次數呢?筆者的內心怕怕的,因而用驗證集來驗證一下模型的準確度:blog
test_loss, test_acc = model.evaluate(test_images, test_labels) print(test_acc)
輸出:圖片
0.9868input
模型的準確度達到了%98.68,接近百分之九十九的樣子,比筆者僅用全鏈接神經網絡訓練的結果高了零點幾的準確度,從中仍是能夠看出卷積神經網絡的有效性,在沒有進行調參的狀況下準確度已經很高了!