MNIST数字分类——使用卷积神经网络

简介

关于使用Dense层(密集连接型网络)处理MNIST数字图像分类的问题,可以参考使用keras构建和训练mnist的神经网络

卷积神经网络,是计算机视觉领域使用最广泛的一种深度学习模型。可以对比,使用简单的卷积神经网络,即可达到比使用Dense层模型精确度更高的模型。

与密集连接层不同,卷积层学到的是图像的局部模式,而Dense层是从输入空间中学习全局模式。

这个重要特性使用卷积神经网络具有以下特点:

  • 学习到模式具有平移不变性,这使得它可以在图像的任意位置识别该模式,能够高效利用数据,只需要更少的训练样本,就可以学习到更具泛化能力的数据表示。
  • 可以学到模式的空间层次结构,通过逐层累积,网络可以有效地学习越来越复杂、越来越抽象的视觉概念

这样一来,卷积神经网络就具有了处理图像模式的先天优势。

本例就是要处理图像识别领域的经典案例——MNIST数据集。

基础概念

对于包含两个空间轴(高度和宽度)和一个深度轴(通道轴)的3D张量,其卷积叫做特征图。

对于RGB图像,它的深度轴为3。对于黑白图像,深度轴为1,表示深度等级。MNIST使用的就是黑白图像。

卷积神经网络从这些输入特征图中提取图块,并对所有这些图块应用相同的变换,生成输出特征图。

输出特征图仍然是3D张量,具有宽度和高度,其深度可以取任意值,输出深度是层的参数,代表过滤器。

过滤器对输入数据的某一方面进行编码,比如单个过滤器可以从更高层次编码一个概念:“输入中包含一只猫”。

MNIST

具体到MNIST,使用Conv2D和MaxPooling2D层的堆叠即可达到相当高的识别精度。

基于对数据集的充分理解,直接上代码:

# 构建卷积神经网络
from keras import layers
from keras import models

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation = 'relu', input_shape = (28, 28, 1))) # 卷积神经网络的输入,与MNIST数据集一致
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation = 'relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation = 'relu'))
# 通过model.summary() 可查看网络架构,参考下文

# 把卷积神经网络处理结果输入到Dense层,这与使用密集连接网络是一样的
model.add(layers.Flatten()) # 需要先把3D张量展开为1D
model.add(layers.Dense(64, activation = 'relu'))
model.add(layers.Dense(10, activation = 'softmax'))
# 此时的网络架构参考下文

# 开始训练模型
from keras.datasets import mnist
from keras.utils import to_categorical

path = r"E:\practice\tf2\mnist\mnist.npz" # 指定文件路径,不要从网络下载
(train_images, train_labels), (test_images, test_labels) = mnist.load_data(path) # 不指定路径时,默认会从网络下载

# 数据预处理
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') /255

# 分类编码
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

# 编译训练模型
model.compile(optimizer = 'rmsprop', loss = 'categorical_crossentropy', metrics = ['accuracy'])
model.fit(train_images, train_labels, epochs = 5, batch_size = 64)

# 在测试数据上评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
解析
  • 卷积神经网络的架构如下:

在这里插入图片描述

第一个卷积层接收(28,28,1)的特征图,输出(26,26,32)的特征图,即它在输入上计算32个过滤器。对于这32个输出通道,每个通道都包含一个26*26的数值网络。

它是过滤器对输入的响应图,表示这个过滤器模式在输入中不同位置的响应。

卷积的两个关键参数:输出特征图的深度、从从输入中提取的图块尺寸。它们由Conv2D层的前两个参数指定。

在每个MaxPooling2D层处理之后,特征图的尺寸减半。这就是最大池化的作用:对特征图进行下采样,与步进卷积类似。

之所以要采用下采样,一是减少需要处理的特征图的元素个数,二是通过让连续卷积层的容器越来越大,从而引入空间过滤器的层级结构。

  • 添加Dense层后的网络架构:
    在这里插入图片描述

  • 训练过程:

在这里插入图片描述

  • 测试结果:
    在这里插入图片描述

可见,测试精确度已经达到了99%,比之前的Dense层模型提高了不少。

这再次说明了卷积神经网络在处理图像模式的优越之处。

小结

深度学习更像是一门艺术,而非科学研究。对于不同的问题,已经有现有的解决方案证明了某些模式比另外一些模式更加有效。

在这种情况下,我们要做的不是从头开始搞一个全新的模型,而是利用已经验证的方案和模型,来开始对特定问题数据的研究。

这样才能事半功倍,并最快地达到想要的效果。

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值