# 手写数字识别
## 实验目的
利用理论课所学的 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 神经网络的原理和结果有了更加深刻的了解和认识;学习了如何使用深度学习框架加载数据集并进行处理和训练;对搭建神经网络的方法和神经网络相关的保存、评估等方法也有所认识。此外,还对比了两�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
资源包含文件:课程报告word+源码及数据+项目截图 由测试结果可以发现,模型基本上可以准确识别大部分的手写数字,模型的训练效果还是不错的。详细介绍参考:https://blog.csdn.net/sheziqiong/article/details/126687949
资源推荐
资源详情
资源评论
收起资源包目录
基于Python的BP网络实现手写数字识别.zip (423个子文件)
基于Python的BP网络实现手写数字识别 课程报告.docx 529KB
.gitignore 182B
train-images-idx3-ubyte.gz 9.45MB
train-images-idx3-ubyte.gz 9.45MB
t10k-images-idx3-ubyte.gz 1.57MB
t10k-images-idx3-ubyte.gz 1.57MB
train-labels-idx1-ubyte.gz 28KB
train-labels-idx1-ubyte.gz 28KB
t10k-labels-idx1-ubyte.gz 4KB
t10k-labels-idx1-ubyte.gz 4KB
train-labels.idx1-ubyte 59KB
t10k-labels.idx1-ubyte 10KB
train-images.idx3-ubyte 44.86MB
t10k-images.idx3-ubyte 7.48MB
MNIST.iml 284B
QQ截图20210616133818.jpg 174KB
QQ截图20210616134425.jpg 165KB
batch1104.jpg 60KB
batch571.jpg 60KB
batch751.jpg 60KB
batch1083.jpg 60KB
batch685.jpg 60KB
batch1027.jpg 60KB
batch234.jpg 60KB
batch234.jpg 60KB
batch925.jpg 59KB
batch925.jpg 59KB
batch1070.jpg 59KB
batch1070.jpg 59KB
batch926.jpg 59KB
batch1086.jpg 59KB
batch753.jpg 59KB
batch753.jpg 59KB
batch1002.jpg 59KB
batch649.jpg 59KB
batch424.jpg 59KB
batch934.jpg 59KB
batch1082.jpg 59KB
batch242.jpg 59KB
batch934.jpg 59KB
batch462.jpg 59KB
batch242.jpg 59KB
batch919.jpg 59KB
batch455.jpg 59KB
batch321.jpg 59KB
batch705.jpg 59KB
batch648.jpg 59KB
batch868.jpg 59KB
batch909.jpg 59KB
batch878.jpg 59KB
batch265.jpg 58KB
batch265.jpg 58KB
batch49.jpg 58KB
batch573.jpg 58KB
batch49.jpg 58KB
batch434.jpg 58KB
batch434.jpg 58KB
batch650.jpg 58KB
batch1081.jpg 58KB
batch1081.jpg 58KB
batch123.jpg 58KB
batch123.jpg 58KB
batch482.jpg 58KB
batch739.jpg 58KB
batch739.jpg 58KB
batch1085.jpg 58KB
batch1085.jpg 58KB
batch1059.jpg 58KB
batch711.jpg 58KB
batch891.jpg 58KB
batch104.jpg 58KB
batch714.jpg 58KB
batch929.jpg 58KB
batch154.jpg 58KB
batch154.jpg 58KB
batch1076.jpg 58KB
batch984.jpg 58KB
batch233.jpg 58KB
batch467.jpg 58KB
batch515.jpg 58KB
batch904.jpg 58KB
batch923.jpg 58KB
batch116.jpg 58KB
batch638.jpg 58KB
batch467.jpg 58KB
batch170.jpg 58KB
batch170.jpg 58KB
batch454.jpg 58KB
batch326.jpg 58KB
batch326.jpg 58KB
batch722.jpg 58KB
batch1056.jpg 58KB
batch638.jpg 58KB
batch592.jpg 58KB
batch872.jpg 58KB
batch438.jpg 58KB
batch876.jpg 58KB
batch606.jpg 58KB
batch676.jpg 58KB
batch1001.jpg 58KB
共 423 条
- 1
- 2
- 3
- 4
- 5
shejizuopin
- 粉丝: 1w+
- 资源: 1300
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 0148电容充放电产生方波再经积分器转成三角波再经微分器转成方波proteus仿真资料.zip
- API网关 vs IDAAS网关 vs WAF,以及API网关在微服务中的应用
- 360T7路由集客AP固件
- meltdown/spectre处理器漏洞知识点整理
- AWDAWDWADWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
- 15000个英文单词, SQLite3数据库,字段为 单词, 翻译,各种时态,复数形式,例句
- Replicate 的 Python 客户端.zip
- Raven 是 Sentry 的旧版 Python 客户端(getsentry.com),已被 sentry-python 取代.zip
- python打包创造-pycache-文件
- 基于Hadoop平台分析准大学生手机网购偏好与趋势
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页