基于Keras实现手写数据集识别(附完整代码)
本文介绍卷积神经网络的入门案例,通过搭建和训练一个模型,实现mnist手写数据集分类
思路流程
1、导入 mnist 数据集
2、探索数据集,并进行数据预处理
3、构建模型
4、训练模型
5、使用训练好的模型
一、导入数据集
使用到mnist数据集,它包含10 类,即手写数字0-9,共 70000 张灰白图片。
数据集中,60000 个样例被作为训练集(每张图片对于一个标签),剩余 10000 个样例作为测试集(每张图片也对于一个标签)。类别之间相互独立,不存在重叠的部分。使用以下代码完成数据集导入:
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()
二、查看数据集,并进行数据预处理
(1)归一化处理
将像素的值标准化至0到1的区间内。(对于灰度图片来说,每个像素最大值是255,每个像素最小值是0,也就是直接除以255就可以完成归一化。)
train_images, test_images = train_images / 255.0, test_images / 255.0
(2)查看数据
将数据集前20个图片数据可视化显示
plt.figure(figsize=(20,10))
for i in range(20):
# 将整个figure分成2行10列,绘制第i+1个子图。
plt.subplot(2,10,i+1)
plt.xticks([]) # 设置不显示x轴刻度
plt.yticks([]) # 设置不显示y轴刻度
plt.grid(False) # 设置不显示子图网格线
plt.imshow(train_images[i], cmap=plt.cm.binary)
plt.xlabel(train_labels[i]) # 设置x轴标签显示为图片对应的数字
# 显示图片
plt.show()
可视化结果如下:
(3)调整数据到我们需要的格式
数据维度为(batch_size, width, height, channel), 原始数据维度为(60000,28,28)/(10000,28,28),此处,我们将数据增加了channel维度,以便于输入到后续网络进行卷积。因为此处为灰度图,所以channel维度为1,若为彩色图片(即RGB),则channel为3。
train_images = train_images.reshape((60000, 28, 28, 1))
test_images = test_images.reshape((10000, 28, 28, 1))
三、构建模型
(1)模型结构搭建
常见卷积神经网络(CNN),主要通过几个卷积层Conv2D 和 池化层MaxPooling2D 层的叠加实现对输入数据的特征提取,最后通过全连接层实现分类。
model = models.Sequential([
# 设置二维卷积层1,设置32个3*3卷积核,激活函数为ReLu函数,input_shape参数将图层的输入形状设置为(28, 28, 1)
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
layers.MaxPooling2D((2, 2)), # 池化层1,2*2采样
# 设置二维卷积层2,设置64个3*3卷积核,激活函数为ReLu函数
layers.Conv2D