为了账号安全,请及时绑定邮箱和手机立即绑定

Keras中使用CNN来完成MNIST手写体识别

标签:
人工智能

 原文出处

在上一篇文章中,使用了传统的多层感知机神经网络来实现手写体识别,具体参见这里,最终获得了大概97%的神经网络,还能不能得到更高的准确率的,答案当然是肯定的,那就是卷积神经网络CNN。在这里我们使用keras的CNN网络来实现MNIST手写体识别任务。具体的步骤与之前类似,直接贴代码吧:

import numpy as np

f = np.load('mnist.npz')
x_train, y_train = f['x_train'], f['y_train']
x_test, y_test = f['x_test'], f['y_test']
f.close()print('训练数据集样本数: %d ,标签个数 %d ' % (len(x_train), len(y_train)))print('测试数据集样本数: %d ,标签个数  %d ' % (len(x_test), len(y_test)))print(x_train.shape)print(x_test.shape)#特征值缩放x_train = x_train / 255x_test = x_test / 255#输出标签进行one-hot编码from keras.utils import np_utilsprint('Integer-valued labels:')print(y_train[:10])#标签进行one-hot编码y_train = np_utils.to_categorical(y_train, 10)
y_test = np_utils.to_categorical(y_test, 10)print('One-hot labels:')print(y_train[:10])#定义模型架构:from keras.layers import Dense, Dropout, Activation, Flattenfrom keras.layers import Conv2D, MaxPool2Dfrom keras.models import Sequential

model = Sequential()
model.add(Conv2D(filters = 16, kernel_size = 2, padding = 'same', activation = 'relu',input_shape = (28, 28, 1)))
model.add(MaxPool2D(pool_size = 2))
model.add(Dropout(0.2))
model.add(Conv2D(filters = 32, kernel_size = 2, padding = 'same', activation = 'relu'))
model.add(MaxPool2D(pool_size = 2))
model.add(Dropout(0.2))
model.add(Conv2D(filters = 64, kernel_size = 2, padding = 'same', activation = 'relu'))
model.add(Flatten())
model.add(Dense(500, activation = 'relu'))
model.add(Dense(10, activation = 'softmax'))

model.summary()#编译模型model.compile(loss = 'categorical_crossentropy', optimizer='adadelta', metrics=['accuracy'])#训练模型x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)print(x_train.shape)print(x_test.shape)
model.fit(x_train, y_train, batch_size=128, epochs = 10, verbose=1, validation_data=(x_test, y_test))#评估模型score = model.evaluate(x_test, y_test, verbose=0)print('Test score:', score[0])print('Test accuracy:', score[1])

最终获得的准确率:https://img1.sycdn.imooc.com//5b39bea00001ed1e04340071.jpg,相比之下确实比传统的神经网络性能好了很多。当然

有兴趣的话还可以自己调整CNN的网络架构,或者调整其他超参数进行测试,相信能得到更好的结果。


那么,CNN相比MLP的不同?

    1.    MLP拥有超多的参数,在MNIST示例中,28*28像素的图片产生的需要更新的参数就超过了50W,CNN可以大大减少

            需要更新的参数。

    2.    MLP在将图片矩阵转换为向量过程中,丢失了图片中包含的所有二维信息,这种空间或者位置信息其实对我们发现像素值之间的规律其实是很有

            帮助的,因此我们需要一种全新的方式来处理图片输入,而CNN通过使用更加稀疏互联的层级来解决这些问题,它可以帮助我们保留发发现

            空间信息,进而发现规律。

总结下来,CNN具有的优点:

    1.    更少的权重;

    2.    空间共享。


注意:由于缺失数据集,代码可能跑不起来,需要下载数据集,这是代码和 数据集的地址:https://github.com/liujiao111/deep-learning/tree/master/cnn-keras-mnist-cnn


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消