keras实战(三)——手写数字识别(CNN)

在上一篇博文里,介绍了如何用全连接网络来对手写数字进行识别,而如果用全连接网络来进行手写数字的识别,没有利用图片的局部信息,准确率不会特别高。在这篇博文里,作者将详细介绍如何用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中文文档

猜你喜欢

转载自blog.csdn.net/cuicheng01/article/details/80302805