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

  • A+
所属分类:安全闲碎

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


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


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

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


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

数据预处理

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


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

train_image_matric = train_image.reshape(6000028281).astype(float)
test_image_matric = test_image.reshape(1000028281).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)


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

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Conv2D, MaxPooling2D, Flatten #卷积层、池化层、平坦层
model = Sequential()

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

添加卷积层

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


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

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

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

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

activation='relu' 激活函数

model.add(Conv2D(filters=16, kernel_size=(5,5), padding='same', input_shape=(28,28,1), activation='relu'))

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


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


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

添加池化层

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


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

最大池化核,取池化数据的最大值;

平均池化核,取池化数据的平均值;

最小池化核,取池化数据的最小值;

L2池化核,取池化数据的L2范数;

图示是最大池化过程


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


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

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


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

添加平坦层

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


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

model.add(Flatten())


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

添加隐藏层

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


model.add(Dense(units=128, kernel_initializer='normal', activation='relu'))
model.add(Dropout(0.5))


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

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

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


model.add(Dense(units=10, kernel_initializer='normal', activation='softmax'))


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

配置训练模型

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


model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

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

训练模型

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


train_history = model.fit(train_image_4D_normalize, train_label_onehotencoding, validation_split=0.2, epochs=10, batch_size=200, verbose=2)


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


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

验证模型准确率

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


模型准确率是 0.9916


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


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


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

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

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


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

model.save('CNN_MNIST_model.h5')


导入模型

load_model('CNN_MNIST_model.h5')

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


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

本文始发于微信公众号(陈冠男的游戏人生):使用CNN卷积神经网络模型训练mnist数据集

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: