莫煩大大keras學習Mnist識別(3)-----CNN
阿新 • • 發佈:2018-12-17
一、步驟:
-
匯入模組以及讀取資料
-
資料預處理
-
構建模型
-
編譯模型
-
訓練模型
-
測試
二、程式碼:
-
匯入模組以及讀取資料
#導包 import numpy as np np.random.seed(1337) # from keras.datasets import mnist from keras.utils import np_utils # 主要採用這個模組下的to_categorical函式,將該函式轉成one_hot向量 from keras.models import Sequential #keras的模型模組from keras.layers import Dense , Activation , Convolution2D, MaxPooling2D, Flatten #keras的層模組 from keras.optimizers import Adam #keras的優化器 #讀取資料,因為本地已經下載好資料在絕對路徑:E:\jupyter\TensorFlow\MNIST_data下,直接採用TensorFlow來讀取 from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('E:\jupyter\TensorFlow\MNIST_data',one_hot = True) X_train = mnist.train.images Y_train = mnist.train.labels X_test = mnist.test.images Y_test = mnist.test.labels
2、資料預處理
x原本的shape為(55000,784),55000表示樣本數量,784表示一個影象樣本拉成一個向量的大小,故要將其轉成28*28這種長×寬的形式。(-1,1,28,28)中的-1是之後batch_size的大小,即一次取batch大小的樣本來訓練,1,28,28表示高為1,長為28,寬為28。
#資料預處理 X_train = X_train.reshape(-1,1,28,28) X_test = X_test.reshape(-1,1,28,28) y_train = np_utils.to_categorical(Y_train,num_classes = 10)#to_categorical將標籤轉化成ont-hot y_test = np_utils.to_categorical(Y_test,num_classes = 10)
3、構建模型
2個卷積層【包括卷積+啟用relu+最大池化】+2個全連線層
#模型構建 model = Sequential() #建立一個序列模型 #在這個模型首層新增一個卷積層,一個卷積過濾器大小為5*5,32個過濾器,採用的padding模式是same,即通過補0使輸入輸出大小一下。首層要加一個輸入大小(1,28,28) model.add(Convolution2D( nb_filter = 32, nb_row = 5, nb_col = 5, border_mode = 'same', input_shape = (1,28,28) )) #接著加一個啟用層 model.add(Activation('relu')) #接著加一個最大池化層,pool大小為(2,2),strides步長長移動2,寬移動2。padding採用same模式 model.add(MaxPooling2D( pool_size = (2,2), strides = (2,2), border_mode = 'same', )) #卷積層2 model.add(Convolution2D(64,5,5,border_mode = 'same')) #啟用層2 model.add(Activation('relu')) #池化層2 model.add(MaxPooling2D(pool_size = (2,2),border_mode = 'same')) #進行全連線之前將矩陣展開成一個長向量 model.add(Flatten()) #全連線層1,大小有1024個引數 model.add(Dense(1024)) #啟用層 model.add(Activation('relu')) #全連線層2,大小為10 model.add(Dense(10)) #輸出層加一個softmax處理 model.add(Activation('softmax'))
4、編譯模型:model.compile
採用model.compile來編譯,函式內參數說明優化器optimizer、損失函式loss、評價標準metrics。
#編譯模型 adam = Adam(lr = 1e-4) model.compile(optimizer=adam, loss = 'categorical_crossentropy', metrics = ['accuracy'])
5、訓練模型:model.fit
類似sklearn中的形式
model.fit(X_train,Y_train,nb_epoch = 20,batch_size = 32)
6、測試:model.evaluate
輸出測試的損失和準確度
loss , acc = model.evaluate(X_test,y_test)