1 # -*- coding: utf-8 -*- 2 """ 3 Created on Sun Jan 20 11:25:29 2019 4 5 @author: zhen 6 """ 7 8 import numpy as np 9 from keras.datasets import mnist 10 from keras.models import Sequential 11 from keras.layers import Dense 12 from keras.layers import Dropout 13 from keras.layers import Flatten 14 from keras.layers.convolutional import Conv2D 15 from keras.layers.convolutional import MaxPooling2D 16 17 # 加載數據 18 (x_train, y_train), (x_test, y_test) = mnist.load_data("../test_data_home") 19 # 轉化訓練數據為四維張量形式 20 x_train = x_train.reshape(x_train.shape[0], 28, 28, 1).astype("float32") 21 x_test = x_test.reshape(x_test.shape[0], 28, 28, 1).astype("float32") 22 # 歸一化 23 x_train /= 255 24 x_test /= 255 25 26 #轉化為one hot 編碼 27 def to_one_hot(y): 28 y_one_hot = np.zeros(10) # 生成全零向量 29 y_one_hot[y] = 1 30 return y_one_hot 31 32 # 重置標簽 33 y_train_one_hot = np.array([to_one_hot(y_train[i]) for i in range(len(y_train))]) 34 y_test_one_hot = np.array([to_one_hot(y_test[i]) for i in range(len(y_test))]) 35 # 搭建卷積神經網絡 36 model = Sequential() 37 model.add(Conv2D(filters=32, kernel_size=(3, 3), strides=(1, 1), padding='same', input_shape=(28, 28, 1), 38 activation='relu')) 39 # 添加最大池化層 40 model.add(MaxPooling2D(pool_size=(2, 2))) 41 # 添加Dropout層 42 model.add(Dropout(0.2)) 43 # 構建深度網絡 44 model.add(Conv2D(64, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu')) 45 model.add(MaxPooling2D(pool_size=(2, 2))) 46 model.add(Dropout(0.2)) 47 model.add(Conv2D(128, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu')) 48 model.add(MaxPooling2D(pool_size=(2, 2))) 49 model.add(Dropout(0.2)) 50 # 展開 51 model.add(Flatten()) 52 # 構造全連接層 53 model.add(Dense(128, activation='relu')) 54 model.add(Dense(64, activation='relu')) 55 model.add(Dense(32, activation='relu')) 56 model.add(Dense(10, activation='softmax')) 57 # 定義損失函數 58 model.compile(loss='categorical_crossentropy', optimizer='adagrad', 59 metrics=['accuracy']) 60 # 訓練 61 model.fit(x_train, y_train_one_hot, validation_data=(x_test, y_test_one_hot), 62 epochs=2, batch_size=128) 63 # 評估 64 # verbose : 0表示不顯示數據,1表示顯示進度 65 scores = model.evaluate(x_test, y_test_one_hot, verbose=0) 66 print(scores)
結果: