目的:實現mnist分類
1.加載mnist圖片數據網絡
(train_x, train_y), (test_x, test_y) = mnist.load_data()
2.修改數據類型,數據歸一化學習
# 將數據轉化爲浮點型 x_train = train_x.astype('float32') y_train = train_y.astype('float32') x_test = test_x.astype('float32') y_test = test_y.astype('float32') #數據歸一化 x_train /= 255 x_test /= 255 # 標籤進行one_hont編碼 y_train = keras.utils.to_categorical(y_train, num_classes=10) y_test = keras.utils.to_categorical(y_test, num_classes=10)
x_train = x_train.reshape(60000, 28, 28, 1) x_test = x_test.reshape(10000, 28, 28, 1)
4.搭建學習網絡編碼
model = Sequential([ Conv2D(filters=6, kernel_size=(5, 5), padding='valid', activation='tanh', input_shape=(28, 28, 1)), MaxPooling2D(pool_size=(2, 2)), Conv2D(filters=16, kernel_size=(5, 5), padding='valid', activation='tanh'), MaxPooling2D(pool_size=(2, 2)), Flatten(), Dense(120, activation='tanh'), Dense(84, activation='tanh'), Dense(10, activation='softmax') ])
5.配置學習網絡lua
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
6.開始訓練code
model.fit(x_train, y_train, batch_size=64, epochs=20, verbose=1, validation_split=0.2, shuffle=True)
7.評價網絡圖片
score = model.evaluate(x_test, y_test, batch_size=64) print(score)
遇到問題:
1.input
ValueError: Negative dimension size caused by subtracting 5 from 1 for 'conv2d_1/convolution' (op: 'Conv2D') with input shapes: [?,1,28,28], [5,5,28,6].
這是由於原本案例用的是Theano做爲keras的後臺,Theano的格式是(1,28,28)的格式,若是是TensorFlow須要修改輸入格式爲(28,28,1)
2.it
Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (60000, 28, 28)
直接導入的mnist數據爲(60000,28,28),而這你的cnn網絡須要的是(60000,28,28,1),因此須要修改矩陣形狀爲(60000,28,28,1)io
x_train = x_train.reshape(60000, 28, 28,1) x_test = x_test.reshape(10000, 28, 28,1)
完整代碼ast
import keras from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Flatten from keras.layers import Conv2D, MaxPooling2D if __name__ == "__main__": (train_x, train_y), (test_x, test_y) = mnist.load_data() x_train = train_x.astype('float32') y_train = train_y.astype('float32') x_test = test_x.astype('float32') y_test = test_y.astype('float32') x_train /= 255 x_test /= 255 y_train = keras.utils.to_categorical(y_train, num_classes=10) y_test = keras.utils.to_categorical(y_test, num_classes=10) x_train = x_train.reshape(60000, 28, 28, 1) x_test = x_test.reshape(10000, 28, 28, 1) model = Sequential([ Conv2D(filters=6, kernel_size=(5, 5), padding='valid', activation='relu', input_shape=(28, 28, 1)), MaxPooling2D(pool_size=(2, 2)), Conv2D(filters=16, kernel_size=(5, 5), padding='valid', activation='relu'), MaxPooling2D(pool_size=(2, 2)), Flatten(), Dense(120, activation='relu'), Dense(84, activation='relu'), Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc']) model.fit(x_train, y_train, batch_size=64, epochs=20, verbose=1, validation_split=0.2, shuffle=True) score = model.evaluate(x_test, y_test, batch_size=64) print(score) model.save('lenet5.h5')