在上一篇博文里,介绍了如何用全连接网络来对手写数字进行识别,而如果用全连接网络来进行手写数字的识别,没有利用图片的局部信息,准确率不会特别高。在这篇博文里,作者将详细介绍如何用keras来搭建一个简单的CNN 网络,以便对mnist手写数字进行更好的识别。好,代码搞起来!
老生常谈,导入需要的包:
from keras.layers import Dense, Activation, Convolution2D, MaxPooling2D, Flatten
import numpy as np
np.random.seed(1337) # for reproducibility
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.optimizers import Adam
导入数据,对数据做简单处理:
from keras.datasets import mnist
# download the mnist to the path '~/.keras/datasets/' if it is the first time to be called
# X shape (60,000 28x28), y shape (10,000, )
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# data pre-processing
X_train = X_train.reshape(-1,1,28,28) / 255.
X_test = X_test.reshape(-1,1,28,28) / 255. # normalize
y_train = np_utils.to_categorical(y_train, num_classes=10)
y_test = np_utils.to_categorical(y_test, num_classes=10)
定义第一个卷积和池化层,滤波器数量为32,大小是5*5,Padding方法是same即不改变数据的长度和宽带。 因为是第一层所以需要说明输入数据的 shape ,激励函数选择 relu 函数。
model = Sequential()
model.add(Convolution2D(
batch_input_shape=(32,1,28,28),
filters=32,
kernel_size=5,
strides=1,
padding='same', # Padding method
data_format='channels_first',
))
model.add(Activation('relu'))
model.add(MaxPooling2D(
pool_size=2,
strides=2,
padding='same', # Padding method
data_format='channels_first',
))
定义第二个卷积和池化层,滤波器数量为32,大小是5*5,Padding方法是依旧是same。 激励函数选择 relu 函数。
model.add(Convolution2D(
filters=64,
kernel_size=5,
strides=1,
padding='same', # Padding method
data_format='channels_first',
))
model.add(Activation('relu'))
model.add(MaxPooling2D(
pool_size=2,
strides=2,
padding='same', # Padding method
data_format='channels_first',
))
定义全连接层和输出层
model.add(Flatten())
model.add(Dense(1024))
model.add(Dense(10))
model.add(Activation('softmax'))
设置adam优化方法,loss函数,metrics方法来观察输出结果
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
好,至此该做的都做了 ,就差训练和评估了,下面进行训练:
model.fit(X_train, y_train, epochs=2, batch_size=32,)
Epoch 1/1
60000/60000 [==============================] - 583s 10ms/step - loss: 0.1006 - acc: 0.9690
训练集误差0.9690,撒花!!!时间虽然稍微长了一些,但是一个epoch就有这么高的准确率还是很棒的。
再来看看测试集的准确率:
loss,accuracy = model.evaluate(X_test,y_test)
print ('loss is ',loss,'accuracy is ',accuracy)
loss is 0.0382467273037 accuracy is 0.9865
测试集准确率0.9865,比训练集还高有木有!!
搞定!!!第三个keras案例到此结束,如果有疑问,私信博主或者参考keras中文文档。