# 手写数字识别
## 实验目的
利用理论课所学的 BP 网络实现手写数字识别
## 实验过程与结果
### 获取 MNIST 数据
MNIST 手写数据集的获取方式有很多种,主要可以从深度学习框架 Pytorch 或 Tensorflow 中下载,也可以通过手动下载的方式获取。通过学习框架下载的方式可以快速获得已经分好类别的训练集和测试集,训练数据和标签数据。
本文使用 Pytorch 深度学习框架进行数据的下载,具体的下载方式为:
![](https://www.writebug.com/myres/static/uploads/2022/1/11/e1de3918a64de3473383da821f9b05b4.writebug)
图 1 获取 MNIST 数据
train_set 获得的是训练数据,第一次使用会进行下载,如果已经存在有文件,则不会再次进行下载。train_loader 会将获得的数据进行打包,方便进行训练,其中 shuffle 功能是将获得的数据打乱顺序。
此外,也可以使用手动获取数据的方式来得到数据集,并通过相关的函数来获取本地的数据并将数据进行划分和标准化。
### 构建 BP 神经网络
BP 神经网络指的是反向传播网络,即误差反向传播的多层前馈网络。因此在本实验中搭建了使用全连接层的 BP 神经网络和基于 CNN 的 BP 神经网络。其中使用全连接层的 BP 神经网络由输入层、隐藏层、和输出层构成。其中输入层的维度是<img src="https://www.writebug.com/myres/static/uploads/2022/1/11/4628d995d332503f29d27187a202d9ba.writebug" style="zoom:80%;" />,隐藏层由两层构成,他们的维度分别是<img src="https://www.writebug.com/myres/static/uploads/2022/1/11/25387000288be769eed48ac3c7caba7a.writebug" style="zoom: 80%;" />和<img src="https://www.writebug.com/myres/static/uploads/2022/1/11/16f794da5647f21fce2cc1071db322c4.writebug" style="zoom:80%;" />,输出层的维度是[<img src="https://www.writebug.com/myres/static/uploads/2022/1/11/959e19eadf13a8007f07a46e45d5d607.writebug" style="zoom:80%;" />]。输出层的 10 代表分类的个数,并且必须要满足大于等于标签中的分类个数,否则会报错。
![](https://www.writebug.com/myres/static/uploads/2022/1/11/9ad5ed8c5720ffde152bff884cbd3e76.writebug)
图 2 全连接层的 BP 神经网络
基于 CNN 的 BP 神经网络使用两层卷积网络和一层全连接层构成,其中第一个卷积神经网络使用 16 大小为 5 的卷积核,padding=2,使用 ReLU 激活并进行池化采样。第二个卷积网络类似,不同之处在于使用 32 个卷积核。因此输入数据的维度是<img src="https://www.writebug.com/myres/static/uploads/2022/1/11/5e7c86537652eaf0c2c665c4a458d5f8.writebug" style="zoom:80%;" />,经过第一层之后维度变为<img src="https://www.writebug.com/myres/static/uploads/2022/1/11/188946a594ea3c870f039bb5ec68a9a8.writebug" style="zoom:80%;" />,经过第二层之后维度变为<img src="https://www.writebug.com/myres/static/uploads/2022/1/11/32525e62cfb53d6baaffebe0ff2ee1ee.writebug" style="zoom:80%;" />,之后变化为:<img src="https://www.writebug.com/myres/static/uploads/2022/1/11/9f3c499cac14945b2b7a0b6bee122adb.writebug" style="zoom:80%;" />
![](https://www.writebug.com/myres/static/uploads/2022/1/11/b0cbc7b9864353bfb7d9f8f344b5b22f.writebug)
图 3 基于 CNN 的 BP 神经网络
### 训练构建的 BP 神经网络
对所构建的两种神经网络分别进行训练可以得到他们在训练集上损失函数和准确度随迭代次数的变化情况如下所示。
![](https://www.writebug.com/myres/static/uploads/2022/1/11/54463284aa4d9e491f87a2768d96dafd.writebug)![](https://www.writebug.com/myres/static/uploads/2022/1/11/959a3015ab4cae2231b362c7da565e94.writebug)
图 4 全连接层 BP 网络训练集的损失函数和准确率变化图
![](https://www.writebug.com/myres/static/uploads/2022/1/11/f7ab32aea9c3081110f73d5d2cbacd5a.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/1/11/fe81ca5f48d8c65487165fde5abf2a65.writebug)
图 5 基于 CNN 的 BP 网络训练集损失函数和准确率变化图
其中,全连接层 BP 网络在经过 25 代训练之后的准确率可以达到 97.86%,而基于 CNN 的网络在同样 25 代训练之后的准确率可以达到 98.85%。
### 测试 BP 网络
在模型训练的同时可以使用测试集进行测试来考察测试集准确度和损失的变化情况。也可以在保存模型之后再选择部分数据进行测试,考察准确度并进行可视化。
在使用两种模型结构进行训练和测试后可以得到如下的表格:
表 1 BP 网络的损失函数和准确率(训练 25 代)
| | Train Loss | Train Accuracy | Test Loss | Test Accuracy |
| ----------- | ---------- | -------------- | --------- | ------------- |
| 全连接层 BP | 0.07437 | 97.86% | 0.09634 | 97.12% |
| CNN_BP | 0.03358 | 98.95% | 0.03146 | 98.97% |
测试集的损失函数和准确率变化情况如下图所示:
![](https://www.writebug.com/myres/static/uploads/2022/1/11/d22f3443fb463834be157951cfcf1a5d.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/1/11/d36f1a7f33c0e47259feb80d9796b6b1.writebug)
图 6 全连接层 BP 网络测试集的损失函数和准确率变化图
![](https://www.writebug.com/myres/static/uploads/2022/1/11/103705ae5b89b9b938f5684dd708a528.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/1/11/de4a0993a3e5d244a2697f6746aadcb0.writebug)
图 7 基于 CNN 的 BP 网络测试集损失函数和准确率变化图
因此可以得到网络准确率和损失函数总的变化图像为:
![](https://www.writebug.com/myres/static/uploads/2022/1/11/19b1c21892c208deea39a74540266211.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/1/11/119a4191b30ab7be36f5a3ed4ae0cfae.writebug)
图 8 神经网络损失函数和准确率随迭代次数变化图(左:全连接 右:CNN)
训练完毕后对测试集的结果进行测试可以得到:
![](https://www.writebug.com/myres/static/uploads/2022/1/11/f0c9969bd34f673d7e96fda33d9431b1.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/1/11/ab68cf6011a707b7b47d0fb10c24a6fd.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/1/11/8d272c14530d4c3edb25cb6f73caf24c.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/1/11/1b89fd20358073cf92fbe190cdc423eb.writebug)
图 9 测试结果可视化
由测试结果可以发现,模型基本上可以准确识别大部分的手写数字,只有个别的数字由于特征不是非常明显甚至兼有其他数字的特征,因此被错误识别。总的来说,模型的训练效果还是不错的。
## 结果分析与实验结论
通过实验可以发现,使用 BP 网络进行训练识别手写数字在一开始基本是随机识别,但是在对整个数据集进行多次训练之后,在训练集和测试集上的准确率都能达到较高的水准并且可以看到,在前几次迭代训练的结果中,损失函数下降的非常快,准确率也快速上升。
此外,两种模型测试集上的损失函数总体上一直在下降,没有出现上升而准确率总体上一直在上升没有出现下降。因此模型并没有出现过拟合的现象,还可以继续迭代进行训练。
对比两种模型可以看到,基于 CNN 的 BP 网络的准确率均高于全连接层的 BP 神经网络,有较好的训练效果。但是 CNN 训练的时间相较于全连接层较长,在数据较多时可能略显吃力。
## 收获、体会及建议
通过手写数字识别的实验,我对 BP 神经网络的原理和结果有了更加深刻的了解和认识;学习了如何使用深度学习框架加载数据集并进行处理和训练;对搭建神经网络的方法和神经网络相关的保存、评估等方法也有所认识。此外,还对比了两�
shejizuopin
- 粉丝: 1w+
- 资源: 1300
最新资源
- (matlab实现)基于模糊控制的光储联合系统控策略研究:(1)对光储系统中的不同储能元件、进行工作时的控制元件模式、并网运行时的电路拓扑以及每一个部件的工作原理进行了详细分析并进行具体仿真模型的搭建
- matlab基于GMM模型的语音识别系统(说话人识别)带有GUI界面和lunwen
- 毕业设计-基于Android Studio实现的学生信息管理系统源码(高分项目)
- 毕业设计-基于Android Studio实现的学生信息管理系统源码
- VDI 2230在ANSYS WORKBENCH中的实现 插件&视频&几何模型&有限元模型&过程文档
- 基于HTML和CSS的静态网页设计静态简历网页设计(个人简历网页模板,亲测可以使用)
- 新年快乐html特效完整代码.html
- 永磁同步电机匝间短路故障MATLAB仿真设计 说明文档和simulink仿真源文件
- 基于HTML和CSS的静态网页设计静态简历网页设计(下载即用).zip
- 无人驾驶汽车自动泊车路径规划 多项式规划的垂直泊车,单步泊车
- 计算机网路自顶向下法第7版课后答案
- coomsol无损检测,钛合金 傅立叶变和b扫 使用的固体力学和固体传热模块耦合
- comsol多裂纹水力压裂扩展,可以实现拉伸和压缩下的破坏 comsol相场法水力压裂,comsol两相驱替,两相流,润湿角,残留量计算,comsol模拟三维随机生成裂隙注浆,考虑浆液粘度时变性浆液
- 小信号建模,阻抗分析法,整个电流环解耦控制,控制框图推导 MATLAB simulink仿真,包含整个系统的解耦建模分析过程;LCL型三相桥式逆变器,采用SPWM调制,锁相环为自行搭建PI控制,功率
- 数据挖掘练习题-贝叶斯、决策树
- Comsol多孔介质流动,渗流, 毛细,传热,传质地表地下水耦合 COMSOL孔隙渗流下的细颗粒迁移运动 对土石混合体进行了数值仿真,考虑了土石混合体孔隙变化,细颗粒侵蚀,骨架结构变形,此问题是一个
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页