神经网络——项目二CNN手写数字识别
1 2 import numpy as np 3 from keras.models import Sequential 4 from keras.layers.core import Dense, Dropout, Activation 5 from keras.layers import Convolution2D, MaxPooling2D, Flatten 6 from keras.optimizers import SGD, Adam 7 from keras.utils import np_utils 8 from keras.datasets import mnist 9 #categrorical_crossentropy 10 11 def load_data(): 12 (x_train, y_train), (x_test, y_test) = mnist.load_data() 13 14 #x_train = x_train[0:number] 15 #y_train = y_train[0:number] 16 x_train = x_train.reshape(x_train.shape[0], 1, 28, 28) 17 x_test = x_test.reshape(x_test.shape[0], 1, 28, 28) 18 x_train = x_train.astype('float32') 19 x_test = x_test.astype('float32') 20 # convert class vector to binary class matrices 21 y_train = np_utils.to_categorical(y_train, 10) 22 y_test = np_utils.to_categorical(y_test, 10) 23 x_train = x_train 24 x_test = x_test 25 #x_test = np.random.normal(x_test) 26 x_train = x_train / 255 27 x_test = x_test / 255 28 return (x_train, y_train), (x_test,y_test) 29 30 (x_train, y_train), (x_test,y_test) = load_data() 31 32 33 model2 = Sequential() 34 model2.add(Convolution2D(25, 3, strides=3, input_shape=(1, 28, 28), data_format='channels_first', padding='same')) 35 model2.add(MaxPooling2D((2, 2))) 36 37 38 39 40 41 model2.add(Convolution2D(50, 3, strides=3, padding='same')) 42 model2.add(MaxPooling2D(2, 2)) 43 44 45 model2.add(Flatten()) 46 47 model2.add(Dense(128, activation='relu')) 48 model2.add(Dense(10, activation='softmax')) 49 50 model2.compile(loss='mse', optimizer=SGD(lr=0.1), metrics=['accuracy']) 51 model2.fit(x_train, y_train, batch_size=200, epochs=10, verbose=1) 52 53 result = model2.evaluate(x_test, y_test, verbose=0) 54 55 print('\nTest Acc:', result)
以上demo是可以运行,但需修改parameters
过程所遇到的Error总结:
1.Negative dimension size caused by subtracting 3 from 1 for 'conv2d_1/convolution' (op: 'Conv2D') .....
2.ValueError: Negative dimension size caused by subtracting 2 from 1 for 'max_pooling2d_2/MaxPool' (op: 'MaxPool') with input shapes: [?,4,1,50].
解决方案如下: