前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用CNN卷积神经网络模型训练mnist数据集

使用CNN卷积神经网络模型训练mnist数据集

作者头像
yichen
发布2021-03-10 20:26:04
1K0
发布2021-03-10 20:26:04
举报
文章被收录于专栏:陈冠男的游戏人生

卷积操作就是卷积核(kernal)跟输入数据每个值相乘再加起来得到的一个值作为输出

图源:https://flat2010.github.io/2018/06/15/手算CNN中的参数

数据预处理

在数据预处理上需要注意不再是一维的了,而要保持数组样式,是 28*28*1 的,其他的没差别

代码语言:javascript
复制
train_image_matric = train_image.reshape(60000, 28, 28, 1).astype(float)
test_image_matric = test_image.reshape(10000, 28, 28, 1).astype(float)
train_image_4D_normalize = train_image_4D / 255
test_image_4D_normalize = test_image_4D / 255
train_label_onehotencoding = np_utils.to_categorical(train_label)
test_label_onehotencoding = np_utils.to_categorical(test_label)

数据预处理之后开始建立模型

代码语言:javascript
复制
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Conv2D, MaxPooling2D, Flatten #卷积层、池化层、平坦层
model = Sequential()
代码语言:javascript
复制

添加卷积层

filters=16 表示有 16 个卷积核(也叫滤镜)

kernel_size=(5,5) 表示卷积核的尺寸

padding='same' 表示对原图片进行填充,使得输出能够保持和输入尺寸一致

input_shape=(28,28,1) 输入的尺寸

activation='relu' 激活函数

代码语言:javascript
复制
model.add(Conv2D(filters=16, kernel_size=(5,5), padding='same', input_shape=(28,28,1), activation='relu'))
代码语言:javascript
复制

从这幅图中可以看到,周围添加了一圈之后,经过卷积核再输出的还是原来的尺寸大小

添加池化层

池化层也有一个池化核,但池化运算分为几种:

最大池化核,取池化数据的最大值; 平均池化核,取池化数据的平均值; 最小池化核,取池化数据的最小值; L2池化核,取池化数据的L2范数;

图示是最大池化过程

代码语言:javascript
复制
model.add(MaxPooling2D(pool_size = (2, 2)))
#沿(垂直,水平)方向缩小比例的因数
#(2,2)会把输入张量的两个维度都缩小一半
代码语言:javascript
复制

添加平坦层

平坦层的作用是将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡

代码语言:javascript
复制
model.add(Flatten())

添加隐藏层

代码语言:javascript
复制
model.add(Dense(units=128, kernel_initializer='normal', activation='relu'))
model.add(Dropout(0.5))

添加隐藏层与输出层之间的关系

代码语言:javascript
复制
model.add(Dense(units=10, kernel_initializer='normal', activation='softmax'))

配置训练模型

代码语言:javascript
复制
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

训练模型

代码语言:javascript
复制
train_history = model.fit(train_image_4D_normalize, train_label_onehotencoding, validation_split=0.2, epochs=10, batch_size=200, verbose=2)

验证模型准确率

模型准确率是 0.9916

可以看到 CNN 比 MLP 不仅准确率提高了,在不加 Dropout 的情况下过度拟合现象也比 MLP 要小一些

导入训练好的模型进行预测

还是先用之前的方法导出模型

model.save('CNN_MNIST_model.h5')

导入模型

load_model('CNN_MNIST_model.h5')

处理好数据之后调用 predict 函数就可以啦

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 陈冠男的游戏人生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档