keras 學習筆記:從頭開始構建網路處理 mnist
阿新 • • 發佈:2018-11-25
全文參考 《 基於 python 的深度學習實戰》
import numpy as np
from keras.datasets import mnist
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[0].shape)
print(y_train)
########################### x 處理 ##################################
# 將訓練集合中的數字變成標準的四維張量形式(樣本數量、長、寬、深(灰度圖 1))
# 並將畫素值變成浮點格式
width = 28
height = 28
depth = 1
x_train = x_train.reshape(x_train.shape[0], width, height, depth).astype('float32')
x_test = x_test.reshape(x_test.shape[0], width, height, depth).astype(' float32')
# 歸一化處理,將畫素值控制在 0 - 1
x_train /= 255
x_test /= 255
classes = 10
####################### y 處理 #######################################
# one host 編碼
def tran_y(y):
y_ohe = np.zeros(10)
y_ohe[y] = 1
return y_ohe
# 標籤將 one-hot 編碼重排
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_train[i]) for i in range(len(y_test))])
###################### 搭建卷積神經網路 ###############################
model = Sequential()
# 添加捲積層,構造 64 個過濾器,過濾器範圍 3x3x1, 過濾器步長為 1, 影象四周補一圈 0, 並用 relu 非線性變換
model.add(Conv2D(filters=64, kernel_size=(3,3), strides=(1,1), padding='same', input_shape=(width, height, 1), activation='relu'))
# 新增 Max_Pooling , 2 x 2 取最大值
model.add(MaxPooling2D(pool_size=(2, 2)))
# 設立 Dropout , 將概率設為 0.5
model.add(Dropout(0.5))
#重複構造, 搭建神經網路
model.add(Conv2D(128, kernel_size=(3, 3), strides=(1,1), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Conv2D(256, kernel_size=(3,3), strides=(1, 1), padding='same', activation='relu'))
model.add((MaxPooling2D(pool_size=(2, 2))))
model.add(Dropout(0.5))
# 將當前節點展平, 構造全連神經網路
model.add(Flatten())
# 構造全連線神經網路
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='reul'))
model.add(Dense(classes, activation='softmax'))
################################ 編譯模型 ##########################
# 一般,分類問題的損失函式才有交叉熵 (Cross Entropy)
model.compile(loss='categorical_crossentropy', optimizer='adagrad', metrics=['accuracy'])
######################### 訓練模型 ################################
model.fit(x_train, y_train_ohe, validation_data=(x_test, y_test_ohe), epochs=20, batch_size=128)
######################## 評價模型 ################################
scores = model.evaluate(x_test, y_test_ohe, verbose=0)
######################## 保持模型與權重 ################################
# 保持整個模型(包括結構、權重)
model.save("mnist_model.h5")