端到端的MNIST訓練數字識别
下面介紹端到端的MNIST訓練數字識别過程。
這個資料集是由LeCun Yang教授和他團隊整理的,囊括了6萬個訓練集和1萬個測試集。每個樣本都是32×32的像素值,并且是黑白的,沒有R、G、B三層。我們要做的是把每個圖檔分到0~9類别中。
下圖是一些手寫數字的樣本

接下來用Keras搭建卷積網絡訓練模型。
1、導入資料和keras卷積子產品
快速開始序貫(Sequential)模型 序貫模型是多個網絡層的線性堆疊,也就是“一條路走到黑”。 可以通過向 Sequential 模型傳遞一個layer的list來構造該模型: from keras.models import Sequential from keras.layers import Dense, Activation model = Sequential([ De
import numpy as np
from keras.datasets import mnist # 資料集
# 導入keras的卷積子產品
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D
先讀入資料,看一下資料集長什麼樣子
沒有下載下傳過的可能要等一段時間下載下傳
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
print(X_train[].shape)
print(Y_train[])
輸出:
3、對資料進行預處理
(1)對資料的次元進行轉化,為我們需要的次元,其中astype是必須的,規定了浮點精度
(2)資料歸一化 因為是圖檔,圖層是0-255,是以就直接255歸一
(3)對資料集進行熱點化(one_hot)
X_train = X_train.reshape(X_train.shape[], , , ).astype('float32')
X_test = X_test.reshape(X_test.shape[], , , ).astype('float32')
X_train /=
X_test /=
def tran_y(y):
y_ohe = np.zeros()
y_ohe[y] =
return y_ohe
Y_train_ohe = np.array([tran_y(Y_train[i]) for i in range(len(Y_train))])
Y_test_ohe = np.array([tran_y(Y_test[i]) for i in range(len(Y_test))])
4、構模組化型
選用Sequential方法建構,然後不斷放入神經層。
(1)第一層是卷積層,過濾器filters為64個,過濾器大小為3x3,步幅為1x1,填充成相同的大小,輸入層的形狀為(28, 28, 1),在第一次輸入資料的時候這個參數input_shape是必須的,後面的不再需要。激活函數選用relu。
(2)第二層是最大池,池化器大小為2x2。
(3)第三個是随機失活dropout,目的是為了防止過拟合,選用0.5意思是随機失活該層50%的節點。
(4)接下來重複建構。
(5)最後展平節點
model = Sequential()
model.add(Conv2D(filters=, kernel_size=(, ), strides=(, ), padding="same", input_shape=(, , ), activation="relu"))
model.add(MaxPooling2D(pool_size=(, )))
model.add(Dropout()
model.add(Conv2D(filters=, kernel_size=(, ), strides=(, ), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(, )))
model.add(Dropout())
model.add(Conv2D(filters=, kernel_size=(, ), strides=(, ), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(, )))
model.add(Dropout())
model.add(Flatten())
建構全連接配接神經網絡
model.add(Dense(, activation = 'relu'))
model.add(Dense(, activation = 'relu'))
model.add(Dense(, activation = 'relu'))
model.add(Dense(, activation = 'softmax'))
添加損失函數,其中categorical_crossentropy是softmax相對應的損失函數,,在對稀疏的目标值預測時有用,優化器選擇adagrad
adagrad說明連結https://blog.csdn.net/tsyccnh/article/details/76769232
metrics為性能評估方法,選擇accuracy——準确率
model.compile(loss='categorical_crossentropy', optimizer= 'adagrad', metrics=['accuracy'])
指定訓練集X,訓練集Y, epochs為循環次數,batch_size為batch的大小
運作結果:
Train on samples, validate on samples
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
Epoch /
/ [==============================] - s ms/step - loss: - acc: - val_loss: - val_acc:
在測試集上評價模型的準确率
scores = model.evaluate(X_test, Y_test_ohe, verbose=)
print("Accuracy: %.2f%%"% (scores[]*100))
結果為
低于書上99%的準确率,推測可能是環境不一樣(CPU筆記本),詳細原因不明,知道的朋友幫忙解答一下