本文主要講CNN(Convolutional Neural Networks)卷積神經(jīng)網(wǎng)絡(luò)在 keras 上的代碼實現(xiàn)鳞尔。 用到的數(shù)據(jù)集還是MNIST。不同的是這次用到的層比較多剑勾,導(dǎo)入的模塊也相應(yīng)增加了一些。在數(shù)據(jù)預(yù)處理部分也與之前有所不同
Demo.py
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation, Conv2D, MaxPooling2D, Flatten
from keras.optimizers import Adam
# 加載數(shù)據(jù)集
#Keras 自身就有 MNIST 這個數(shù)據(jù)包乱陡,再分成訓(xùn)練集和測試集溶弟。x 是一張張圖片,y 是每張圖片對應(yīng)的標(biāo)簽失暂,即它是哪個數(shù)字彼宠。
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 數(shù)據(jù)預(yù)處理
X_train = X_train.reshape(-1, 1, 28, 28)
X_test = X_test.reshape(-1, 1, 28, 28)
# 將label變?yōu)橄蛄?# 對于 y鳄虱,要用到 Keras 改造的 numpy 的一個函數(shù) np_utils.to_categorical弟塞,把 y 變成了 one-hot 的形式凭峡,即之前 y 是一個數(shù)值, 在 0-9 之間决记,現(xiàn)在是一個大小為 10 的向量摧冀,它屬于哪個數(shù)字,就在哪個位置為 1系宫,其他位置都是 0索昂。
y_train = np_utils.to_categorical(y_train, 10)
y_test = np_utils.to_categorical(y_test, 10)
# 構(gòu)建神經(jīng)網(wǎng)絡(luò)
model = Sequential()
#添加第一個卷積層,濾波器數(shù)量為32扩借,大小是5*5椒惨,Padding方法是same即不改變數(shù)據(jù)的長度和寬帶。
#因為是第一層所以需要說明輸入數(shù)據(jù)的 shape 潮罪,激勵選擇 relu 函數(shù)
# 卷積層一
model.add(Conv2D(32, kernel_size = (5, 5), strides = (1, 1), padding = 'same', activation = 'relu', input_shape = (1, 28, 28)))
#model.add(Convolution2D(
# nb_filter=32,
# nb_row=5,
# nb_col=5,
# border_mode='same', # Padding method
# dim_ordering='th', # 采用 theano 的 input 格式
# input_shape=(1, # channels
# 28, 28,) # height & width
#))
#model.add(Activation('relu'))
# 池化層一 pooling(池化康谆,下采樣),分辨率長寬各降低一半嫉到,輸出數(shù)據(jù)shape為(32沃暗,14,14)
model.add(MaxPooling2D(pool_size = (2, 2), strides = (1, 1), padding = 'same'))
#model.add(MaxPooling2D(
# pool_size=(2, 2),
# strides=(2, 2),
# border_mode='same', # Padding method
#))
# 卷積層二
model.add(Conv2D(64, kernel_size = (5, 5), strides = (1, 1), padding = 'same', activation = 'relu'))
# 池化層二
model.add(MaxPooling2D(pool_size = (2, 2), strides = (1, 1), padding = 'same'))
#model.add(Convolution2D(64, 5, 5, border_mode='same'))
#model.add(Activation('relu'))
#model.add(MaxPooling2D(pool_size=(2, 2), border_mode='same'))
# 全連接層一何恶,經(jīng)過以上處理之后數(shù)據(jù)shape為(64孽锥,7,7)细层,需要將數(shù)據(jù)抹平成一維惜辑,再添加全連接層1
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
# 全連接層二,即輸出層
model.add(Dense(10))
model.add(Activation('softmax'))
# 選擇并定義優(yōu)化求解方法
adam = Adam(lr = 1e-4)
# 選擇損失函數(shù)疫赎、求解方法韵丑、度量方法,設(shè)置adam優(yōu)化方法虚缎,loss函數(shù), metrics方法來觀察輸出結(jié)果
model.compile(optimizer = adam, loss = 'categorical_crossentropy', metrics = ['accuracy'])
# 訓(xùn)練模型
model.fit(X_train, y_train, epochs = 2, batch_size = 32)
# 評估模型
loss, accuracy = model.evaluate(X_test, y_test)
print ''
print 'loss: ', loss
print 'accuracy: ', accuracy
結(jié)果:
Using TensorFlow backend.
Epoch 1/2
60000/60000 [==============================] - 55s - loss: 0.4141 - acc: 0.9234
Epoch 2/2
60000/60000 [==============================] - 56s - loss: 0.0743 - acc: 0.9770
9920/10000 [============================>.] - ETA: 0s
loss: 0.103529265788
accuracy: 0.9711