天天看點

Keras快速上手 ——學習筆記(一)端到端的MNIST訓練數字識别端到端的MNIST訓練數字識别

端到端的MNIST訓練數字識别

下面介紹端到端的MNIST訓練數字識别過程。

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

下圖是一些手寫數字的樣本

Keras快速上手 ——學習筆記(一)端到端的MNIST訓練數字識别端到端的MNIST訓練數字識别

接下來用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筆記本),詳細原因不明,知道的朋友幫忙解答一下

繼續閱讀