1. 程式人生 > >keras 學習筆記:從頭開始構建網路處理 mnist

keras 學習筆記:從頭開始構建網路處理 mnist

全文參考 《 基於 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")