基于 TensorFlow 的 PyTorch-MNIST 手写体识别系统开发案例

1 概述
1.1 背景介绍
随着人工智能技术的飞速发展,图像识别技术在众多领域得到了广泛应用。手写体识别作为图像识别的一个重要分支,其在教育、金融、医疗等领域具有广泛的应用前景。本案例旨在利用深度学习框架 PyTorch,结合 MNIST 手写体数据集,构建一个高效、准确的手写体识别系统。本案例采用的 MNIST 数据库是一个大型手写数字数据库,通常用于训练各种图像处理系统。该数据库还广泛用于机器学习领域的培训和测试。MNIST 数据集共有训练数据 60000 项、测试数据 10000 项。每张图像的大小为 28*28(像素),每张图像都为灰度图像,位深度为 8(灰度图像是 0-255)。
1.2 适用对象
个人开发者
高校学生
1.3 案例时间
本案例总时长预计 40 分钟。
1.4 案例流程

说明:
① 下载并安装 PyCharm;
② 创建 Python 文件,部署 TensorFlow;
③ 编写代码,实现手写体识别;
④ 运行代码,生成结果。
基于TensorFlow框架的手写体识别👈👈👈体验完整版案例,请点击这里。
2 操作步骤
2.1 安装环境
案例前置条件需要安装以下两个工具:
1.安装 TensorFlow
2.安装 Matplotlib
2.2 安装 PyCharm
1.下载 PyCharm
进入云主机,打开左侧 Firefox 浏览器,将https://www.jetbrains.com.cn/en-us/pycharm/download/download-thanks.html?platform=linux
复制到浏览器,复制后按回车会打开 PyCharm 官网页面,自动下载 PyCharm。

下载完毕后点击右上角文件图标打开存放地址。

打开后选择在此处解压。

解压后进入到目录。

进入目录内容显示如下。

2.安装 PyCharm
双击进入 bin 目录,双击 PyCharm 图标打开 PyCharm。

打开 PyCharm 后显示如下,地区选择中国大陆后点击下一步。

勾选同意后,点击继续。

点击不发送。

点击 30 天免费试用。

点击新建项目。

点击创建。

2.3 下载 TensorFlow 框架
1.新建目录
打开 PyCharm,单击左上角图标在弹出的菜单中选择“新建>目录”。

目录名称输入:demo。

2.新建文件
在 PyCharm 左侧新建的 demo 目录单击鼠标右键,在打开的菜单中选择“新建>Python 文件”。

输入 Python 文件的名字,自定义即可。

3.部署 TensorFlow 框架
新建好后,在左侧找到新建好的 Python 文件双击打开。

单击左下角图标打开终端。

{{{width="55%" height="auto"}}}
在终端输入命令,部署 TensorFlow 框架。

2.4 编写代码
1.创建和编写文件
在 demo 目录下新建一个 py 文件进行代码编辑。
以下代码开发者可以前往:
https://dtse-mirrors.obs.cn-north-4.myhuaweicloud.com/case/0008/demo.txt,下载获取。

当代码编写完毕后,需要下载相应的 Python 包,在终端输入命令:pip3 install matplotlib 指令下载。

2.代码部分讲解
1)导入数据包;
首先对于导包部分导入 TensorFlow、matplotlib、numpy 等库,用于进行深度学习模型的构建数据可视化。

2)下载 MNIST 数据集;
这段代码加载了 MNIST 数据集,这是一个包含手写体数字 0 到 9 的图片数据集,常用于图像识别的入门任务。数据集分为训练集和测试集。

3)数据预处理;
这里对图像数据进行了归一化处理,将像素值从 0-255 的范围缩放到 0-1。这样做可以加快模型的训练速度并提高其性能。之后,通过增加一个维度,将数据形状调整为模型所需的格式(样本数量,高度,宽度,通道数),并将数据类型转换为 float32。

4)创建数据集对象;
将训练和测试数据转换为 TensorFlow 的数据集对象,并设置批次大小为 32,并对训练数据进行混洗。

5)构建模型;
构建一个顺序模型,包括数据增强层、三个卷积层(每个卷积层后跟一个池化层)、一个展平层、一个丢弃层以及两个全连接层。

6)编译模型;
配置模型的学习过程,选择 Adam 优化器、稀疏分类交叉熵损失函数,并设置评估指标为准确率。

7)回调模型;
定义三个回调函数,用于在学习工程中调整学习率、早停以及在验证损失改善时保存模型权重。

8)训练模型;
使用训练数据集训练模型,指定训练轮数为 10,使用测试数据集进行验证,并应用之前定义的回调函数。

9)加载模型最佳权重;
在训练完成后,加载具有最佳验证的损失的模型权重。

10)评估模型;
在测试数据集上评估模型的性能,并打印准确率。

11)可视化训练过程;
使用 matplotlib 绘制训练和验证损失及准确率的变化曲线。

12)预测并展示结果。
定义 plot_image 函数:用于绘制单个预测结果,显示图像、真是标签、预测概率和预测标签;
预测测试样本:使用 model.predict 对测试数据集进行预测;
绘制预测结果:选择前几个测试样本,调用 plot_image 函数绘制预测结果。

2.5 运行结果生成
代码编写完毕后右击鼠标,点击运行。

{{{width="55%" height="auto"}}}
运行后会出现手写体识别的结果,上方图片是手写的字体,图片下方是模型预测的结果。

{{{width="55%" height="auto"}}}
运行结果中有 loss 损失函数,以及 acc 准确率,可以看到 loss 损失函数在慢慢的降低,而 acc 准确率在慢慢的升高。acc 准确率提高的原因是因为训练轮数的不断增加,交叉熵损失衡量了模型预测与真实标签之间的差异。在训练过程中,优化器的目标是使损失函数最小化。随着训练轮数的增加,损失函数的值逐渐降低,这意味着模型的预测越来越接近真实标签,从而提高准确率。可以看到每一个 epoch 中每一秒的准确率以及损失率的变换。

Loss 损失率和 acc 准确率折线图,能供清楚的看到,loss 损失率随着 eopch 的不断增加而减少,acc 准确率则随着 epoch 的不断增加而不断提高。

至此,基于 TensorFlow 的手写体识别内容全部完毕。
想了解更多手写体识别的内容可以访问:
https://yann.lecun.com/exdb/mnist/
想了解更多关于 TensorFlow 框架的可以访问:
评论