基于深度学习的MNIST数据集训练与手写数字识别

本文通过深度学习算法训练MNIST数据集,实现手写数字识别。探讨了全连接神经网络(DNN)和卷积神经网络(CNN)的原理与结构,包括卷积层和池化层的作用。实验结果显示,适当调整神经网络参数和训练次数,CNN在正确率上优于DNN。
摘要由CSDN通过智能技术生成

基于深度学习的MNIST数据集训练与手写数字识别

实验目的

通过深度学习算法对训练集数据进行训练,实现MNIST数据集的识别

实验原理

全连接神经网络

全连接神经网络是一种按照误差逆向传播算法训练的多层前馈神经网络。无论在网络理论还是在性能方面已比较成熟。其突出优点就是具有很强的非线性映射能力和柔性的网络结构。网络的中间层数、各层的神经元个数可根据具体情况任意设定,并且随着结构的差异其性能也有所不同。

全连接神经网络的计算过程由正向计算过程和反向计算过程组成。正向传播过程,输入模式从输入层经隐含层逐层处理,并转向输出层,每一层神经元的状态只影响下一层神经元的状态。如果在输出层不能得到期望的输出,则转入反向传播,将误差信号沿原来的连接通路返回,通过修改各神经元的权值,使得误差信号最小。

卷积神经网络

卷积神经网络分为卷积层块和全连接层块两个部分。下面我们分别介绍这两个模块。

卷积层块里的基本单位是卷积层后接最大池化层:卷积层用来识别图像里的空间模式,如线条和物体局部,之后的最大池化层则用来降低卷积层对位置的敏感性。卷积层块由两个这样的基本单位重复堆叠构成。在卷积层块中,每个卷积层都使用5x5的窗口,并在输出上使用sigmoid激活函数。第一个卷积层输出通道数为6,第二个卷积层输出通道数则增加到16。这是因为第二个卷积层比第一个卷积层的输入的高和宽要小,所以增加输出通道使两个卷积层的参数尺寸类似。卷积层块的两个最大池化层的窗口形状均为2x2 ,且步幅为2。由于池化窗口与步幅形状相同,池化窗口在输入上每次滑动所覆盖的区域互不重叠。

卷积层块的输出形状为(批量大小, 通道, 高,宽)。当卷积层块的输出传入全连接层块时,全连接层块会将小批量中每个样本变平(flatten)。也就是说,全连接层的输入形状将变成二维,其中第一维是小批量中的样本,第二维是每个样本变平后的向量表示,且向量长度为通道、高和宽的乘积。全连接层块含3个全连接层。它们的输出个数分别是120、84和10,其中10为输出的类别个数。

总的来说,卷积神经网络的结构为输入—卷积层—池化层—卷积层—池化层—全连接层—输出。卷积核里面的参数,只是一开始是随机数,它本身是需要训练的权重值,只是一开始被初始化了为随机数,并不是一直都是随机数,它会随着网络的训练,逐渐发生变化,最后生成固定的权重值。

实验环境

基于anaconda3的python环境

实验步骤

环境配置

下载pycharm

下载anaconda3并配置环境变量

创建open-mmlab的新环境

通过读.txt文件安装所需的库

在pycharm中添加解释器

搭建全连接神经网络

加载数据集

将图片数据展开成一维

搭建全连接神经网络

对网络进行编译

通过训练集数据对网络进行训练

输出结果

搭建卷积神经网络

加载数据集

权重与偏置初始化

搭建卷积函数与最大池化函数

通过训练集数据对网络进行训练

输出结果

识别手写数字

手写数字并拍照

处理数字图片使其转化为矩阵

导入训练好的神经网络中

输出结果

实验结果及分析

DNN

单隐藏层模型

首先采用较少单元数的单隐藏层全连接神经网络进行MNIST数据集的训练与识别

经过训练后,得到结果:test_loss: 0.5499270486116409 test_accuracy: 0.8608999848365784

我们注意到,由于神经网络的训练过程存在一定的随机性,故即使是相同的网络结构与训练方法所得出的识别率也有一定的波动,故我们对神经网络模型都进行了5次独立的训练,取平均值作为实验结果。后文中所得到的正确率均为相同条件下的平均值。

调整神经网络的参数

可以通过调整神经网络的参数来改变神经网络的性能

首先我们可以改变神经网络的单元数量。增加神经网络的单元数量,维持其他不变,得到结果:test_loss: 0.480959872841835 test_accuracy: 0.9620000123977661

我们也可以通过添加一个隐藏层来尝试改变神经网络的性能。在上一步的基础上,添加一个额外的隐藏层。维持其他不变,得到结果:test_loss: 0.25953738329410553 test_accuracy: 0.9664000272750854

通过对比可以发现,增加神经元数量与添加隐藏层可以一定程度上提高识别的正确率。

调整神经网络训练次数

神经网络训练次数也有一定的影响。直观来说,训练次数越多,训练效果越好。我们使用双隐藏层神经网络结构,分别将训练回合设定为5次、10次、20次、30次,得到结果如下所示

当训练回合为5次时,test_loss: 0.3545956725597382 test_accuracy: 0.9516000151634216

当训练回合为10次时,test_loss: 0.3348649759173393 test_accuracy: 0.954800009727478

当训练回合为20次时,test_loss: 0.25953738329410553 test_accuracy: 0.9664000272750854

当训练回合为30次时,test_loss: 0.2141496712207794 test_accuracy: 0.9739000201225281

由结果可知,当训练次数过少时,识别的正确率较差,随着次数的上升,正确率也会有一定程度的提高。但是当训练次数增大后,正确率并不会一直上升,这是由全连接神经网络算法的上限决定的。

CNN

CPU运行CNN

tensorflow

该部分是基于tensorflow的神经网络识别。TensorFlow 是一个端到端开源机器学习平台。它拥有一个全面而灵活的生态系统,其中包含各种工具、库和社区资源,可助力研究人员推动先进机器学习技术的发展,并使开发者能够轻松地构建和部署由机器学习提供支持的应用。tensorflow支持CPU与GPU运行,这里我们使用调用CPU的tensorflow框架搭建CNN神经网络

少量次数的CNN训练

修改训练回合可以提高正确率。如果我们将一个训练回合设定为6万次对训练集数据的随机训练(数据集包含5万个手写数字图片),当我们分别将训练回合设定为1次、2次、3次、5次,得到正确率如下所示

当训练回合为1次时,test accuracy: 0.9787999987602234

当训练回合为2次时,test accuracy: 0.9818000197410583

当训练回合为3次时,test accuracy: 0.9855999946594238

大量次数的CNN训练

当训练回合为5次时,test accuracy: 0.09799999743700027

通过观察正确率的变化趋势图,发现在训练回合为4次时正确率突然下降,几乎失去了识别能力。当重新将训练回合设为5次时,该现象消失了,表现出了很好的训练结果(test accuracy: 0.9894999861717224)。继续加大训练回合到10次,此时不能实现识别。本次训练中发现在训练回合为5.7次左右时正确率突然下降,并且保持在0.1左右&#

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值