目录
5.1定义辅助函数rightness,用于计算预测结果的准确率。其中,输入参数predictions是模型对于样本的预测结果,labels是样本的真实标签。
一.项目的背景和目的
1.1项目背景:
手写数字识别是计算机视觉领域的一个重要任务,它的目标是让计算机能够识别和理解人类手写的数字。手写数字识别在很多场景中都有广泛的应用,如银行支票的自动读取、邮政编码的自动识别等。然而,由于手写数字的形状、大小、笔画粗细等因素的变化,手写数字识别一直是一个具有挑战性的问题。
1.2目的:
本项目的目的是使用PyTorch框架实现一个基于深度学习的手写数字识别系统。通过训练一个深度神经网络模型,使其能够准确地识别出手写数字图片上的数字。这个项目不仅可以提高我们对深度学习和PyTorch的理解和应用能力,也可以为实际的手写数字识别问题提供解决方案。
二.思路实现
大致流程:

卷积神经网络大致结构


三.数据的来源
2.1公共的数据集MNIST
MNIST是一个经典的机器学习入门数据集,相当于机器学习领域的"hello world", 包括6万张图像和标签的训练集,1万张图像和标签的测试集,每张为28x28大小的灰度图片(784个像素点,每个点用一个浮点数表示其亮度),其中包含一个0-9的数字。我们的任务就是训练一个模型尽可能的准确识别出图像中的数字。
2.2自定义的数据集
训练模型的数据集是自定义的数据集,每张图片是的像素大小,内容分别是手写的0~9的数字, 每个类别各有55张图片,这里选各类图片的50张作为训练集,5张作为测试集,分别放入train和test的文件夹中,里面的每个文件夹的标题就是图片的分类标签,这样便于用pytorch的ImageFolder库直接读取数据。


2.2.1自定义数据训练
导入需要用到的库
输入训练的数据
定义神经网络模型和损失函数
训练模型

结果可视化
train_loss表示训练集的loss函数,train_acc表示训练集的准确率;test_loss表示测试集的loss函数,test_acc表示测试集的准确率
通过观察train_acc变量可以看到,训练集的准确率为93%,test_acc测试集准确率才78%,出现了过拟合现象,而且训练集的准确率跟测试集的准确率天差地别,模型效果不理想,所以我又重新定义了一个神经网络模型进行训练,数据集使用的是mnist公共的数据集进行训练,具体过程在----四.代码实现,感兴趣的小伙伴可以看看哦!
四.代码实现
4.1超参数设定
加载数据集之前,先定义超参数。


4.2查看数据集
通过Matplotlib绘制数据集中的手写数字。

4.3构建卷积神经网络
基于Pytorch中的nn.Module类构建卷积神经网络。代码如下:


五.训练神经网络模型
5.1定义辅助函数rightness,用于计算预测结果的准确率。其中,输入参数predictions是模型对于样本的预测结果,labels是样本的真实标签。

5.2创建实例化模型,定义损失函数和优化器。

5.3将训练模型和验证模型的语句封装成函数。

5.4开始训练模型 

5.5查看模型训练效果


通过观察图像我们发现模型的训练的准确率挺高的,效果很理想 ,没有出现先过拟合现象。
5.6验证模型
5.6.1将训练过的模型在测试集上进行测验。

通过输出模型的准确率,我们发现模型的准确率高达99%
5.6.2再随意从测试集中读入一张图片,检验模型的分类结果

六.手写数字识别GUI界面实现
基于ConvNet模型,用MNIST数据集训练的手写数字分类模型
带GUI界面 在MNIST上准确率99%以上
GUI界面支持主动手写输入、识别
主要通过主函数main.py运行启动界面,定义了三个py文件,分别为myfunction.py、mygui.py和mymodel1.py文件。

主要模块代码如下:
myfunction.py模块代码主要如下

mygui.py模块代码主要如下

mymodel1.py模块代码在4.3构建卷积神经网络中哦!!!

main.py运行程序的代码如下

6.1GUI界面运行跟识别效果

在识别过程中,我也发现了一些问题,就是识别有时候不太准确,比如:

这个问题主要出自于我们的书写习惯不符合MNIST数据集的习惯,这就会导致识别结果不准确,要解决这个问题就需要我们的书写习惯必须需要严格符合MNIST数据集的习惯,否则识别会不准确。这也体现了神经网络的方法高度依赖数据集的特点
七.总结
多上手实践,不放过每一个有疑问的点,用脑图或者流程图先整理下大致思路,再逐步发散,加深理解,问题自然就迎刃而解,希望这篇文章能对您有帮助,感谢您的阅读,不妨动动手指点亮👍👍吧,您的支持就是我的动力。菜鸟一枚,浅薄之见。继续努力!继续rush!

2746

被折叠的 条评论
为什么被折叠?



