CNN应用于手写数字识别
1import numpy as np
2from keras.datasets import mnist
3from keras.utils import np_utils
4from keras.models import Sequential
5from keras.layers import Dense,Dropout,Convolution2D,MaxPooling2D,Flatten
6from keras.optimizers import Adam
Using TensorFlow backend.
1# 载入数据
2(x_train,y_train),(x_test,y_test) = mnist.load_data()
3# (60000,28,28)->(60000,28,28,1),最后一维为深度,黑白为1,彩色为3
4x_train = x_train.reshape(-1,28,28,1)/255.0
5x_test = x_test.reshape(-1,28,28,1)/255.0
6# 换one hot格式
7y_train = np_utils.to_categorical(y_train,num_classes=10)
8y_test = np_utils.to_categorical(y_test,num_classes=10)
9
10# 定义顺序模型
11model = Sequential()
12
13# 第一个卷积层
14# input_shape 输入平面
15# filters 卷积核/滤波器个数
16# kernel_size 卷积窗口大小
17# strides 步长
18# padding padding方式 same/valid
19# activation 激活函数
20model.add(Convolution2D(
21 input_shape = (28,28,1),
22 filters = 32,
23 kernel_size = 5,
24 strides = 1,
25 padding = 'same',
26 activation = 'relu',
27))
28# 第一个池化层
29model.add(MaxPooling2D(
30 pool_size = 2,
31 strides = 2,
32 padding = 'same',
33))
34# 第二个卷积层
35model.add(Convolution2D(64,5,strides=1,padding='same',activation='relu'))
36# 第二个池化层
37model.add(MaxPooling2D(2,2,'same'))
38# 把第二个池化层的输出扁平化为1维
39model.add(Flatten())
40# 第一个全连接层
41model.add(Dense(1024,activation='relu'))
42# Dropout
43model.add(Dropout(0.5))
44# 第二个全连接层
45model.add(Dense(10,activation='softmax'))
46
47# 定义优化器
48adam = Adam(lr=1e-4)
49
50# 定义优化器,loss function,训练过程中计算准确率
51model.compile(optimizer=adam,loss='categorical_crossentropy',metrics=['accuracy'])
52
53# 训练模型
54model.fit(x_train,y_train,batch_size=64,epochs=10)
55
56# 评估模型
57loss,accuracy = model.evaluate(x_test,y_test)
58
59print('test loss',loss)
60print('test accuracy',accuracy)
WARNING:tensorflow:From C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\ops\resource_variable_ops.py:435: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version. Instructions for updating: Colocations handled automatically by placer. WARNING:tensorflow:From C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\ops\math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version. Instructions for updating: Use tf.cast instead. Epoch 1/10 60000/60000 [==============================] - 109s 2ms/step - loss: 0.3392 - accuracy: 0.9022 Epoch 2/10 60000/60000 [==============================] - 110s 2ms/step - loss: 0.0953 - accuracy: 0.9714 Epoch 3/10 60000/60000 [==============================] - 110s 2ms/step - loss: 0.0659 - accuracy: 0.9801 Epoch 4/10 60000/60000 [==============================] - 111s 2ms/step - loss: 0.0521 - accuracy: 0.9842 Epoch 5/10 60000/60000 [==============================] - 111s 2ms/step - loss: 0.0439 - accuracy: 0.9866 Epoch 6/10 60000/60000 [==============================] - 110s 2ms/step - loss: 0.0368 - accuracy: 0.9883 Epoch 7/10 60000/60000 [==============================] - 110s 2ms/step - loss: 0.0313 - accuracy: 0.9897 Epoch 8/10 60000/60000 [==============================] - 110s 2ms/step - loss: 0.0280 - accuracy: 0.9911 Epoch 9/10 60000/60000 [==============================] - 110s 2ms/step - loss: 0.0238 - accuracy: 0.9926 Epoch 10/10 60000/60000 [==============================] - 110s 2ms/step - loss: 0.0223 - accuracy: 0.9927 10000/10000 [==============================] - 5s 540us/step test loss 0.022867686682718342 test accuracy 0.9915000200271606