1. 程式人生 > >莫煩大大keras學習Mnist識別(3)-----CNN

莫煩大大keras學習Mnist識別(3)-----CNN

一、步驟:

  1. 匯入模組以及讀取資料

  2. 資料預處理

  3. 構建模型

  4. 編譯模型

  5. 訓練模型

  6. 測試

二、程式碼:

  1. 匯入模組以及讀取資料

#導包
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)