PyTorch下基于CNN的手写数字识别及应用研究∗

2021-06-29 08:41宗春梅张月琴
计算机与数字工程 2021年6期
关键词:手写卷积神经网络

宗春梅 张月琴 石 丁

(1.忻州师范学院计算机科学与技术系 忻州 034000)(2.太原理工大学计算机科学与技术学院 太原 030024)

1 引言

手写数字识别在现实生活中发挥着越来越重要的作用,从邮政快递的普通信息单,到金融财务领域的数据统计,手写数字识别都有着非常广泛的应用。如何将手写数字识别率进行提升并很好地应用于实际服务环节,是现阶段手写数字识别的基本目标。传统手写数字识别方法存在图像预处理过程复杂、图像特征提取冗余、网络模型识别率不足等问题[1]。卷积神经网络独特的二维数据处理方式和在分类识别时自动提取图像特征等特点可以提高手写数字识别的泛化能力和准确度[2~4],因此引发众多学者将如何把卷积神经网络更好地应用于手写数字识别服务作为研究对象,从而使手写数字识别应用服务质量日益提升。

1998年Yann LeCun设计出LeNet-5卷积神经网络模型,该网络模型后来被广泛应用于手写数字识别技术上[4~5]。卷积神经网络模型(ConvolutionalNeural Networks,CNN)能够得出原始图像的有效表征,这使得CNN能够在原始像素基础上经过极少的预处理识别出图像视觉规律,但LeNet-5对于复杂问题的处理结果并不理想[5]。文献[6]提出一种用SVM分类器进行分类识别的深度学习模型CNN-1,并将其应用于卷面手写数字识别,取得了很好的识别效果,但该模型训练数据仅针对MNIST数据集,具有一定的局限性。文献[7]提出通过对RGB图像进行高斯低通滤波、计算图像均值等处理以提升抗几何攻击性,并对LeNet-5中卷积层和池化层数量及批处理数量。梯度下降步长等参数取不同值进行研究,在MNIST等数据集上得到了较好的实验结果。文献[8]采用LeNET-5卷积模型以阶梯式处理输入数据为手段剔除干扰信息获得顶层数据特征,使手写数字识别结果准确度提升,降低了图像的过度拟合度,但在针对不同类型的图像进行处理时效果欠佳。文献[9]对通过建立卷积层和采样层交替出现的网络中间层对LeNet-5神经网络模型进行了改进,很好地提取到了输入数据特征,加入惩罚项以消除过拟合现象,相对减少了预处理工作量,在识别性能上优于传统方法。文献[10]对于卷积神经网络LeNet-5模型用在手写体数字识别上出现的问题提出三项优化改进办法,提出通过添加权值衰减项降低误识率,采用深度学习中dropout技术训练深度神经网络以提升网络泛化能力和识别率,同时有效避免了过拟合现象,最终将识别率从93.61%提高到了97.30%。文献[11]在CNN图像识别过程中用加权PCA矩阵的形式表达卷积核,数据在CNN模型流程中利用每层的映射结果以生成码本的方式产生高层特征向量。传统方法中卷积神经网络模型在进行特征提取后大都采用Softmax等进行分类,随着支持向量机(Sup⁃port Vector Machine,SVM)等浅层分类器分类性能的成熟发展,学者们逐渐将CNN模型与性能更优的SVM分类器进行结合进行模式识别的研究。文献[12]提出一种结合CNN与SVM进行手写数字识别的方法,实验结果证明将CNN与SVM结合进行分类效果优于一些传统分类器,但算法的复杂度及分类速度改变不明显。

研究表明,虽然在CNN的背景下人们已经提出不少手写数字识别的算法,但这些算法存在以下局限性:其一,大多算法开放性差,运行速度有限,模块易拓展较差,不支持自动求导功能等;其二,数据集相对较单一,训练及测试数据本土性较差;其三,对模型的训练过程缺乏及时的监管。针对上述问题,本文引入了深度学习框架PyTorch[13],并在PyTorch框架下对LeNet-5模型改进搭建手写数字识别模型结构,使用MNIST样本库对改进后的模型进行训练测试,实现了手写数字识别并得到较高的准确率。在训练网络的过程中,借助TensorBoard这个可视化工具以便帮助我们监督整个网络模型的训练过程[14~15],并为网络模型的参数优化提供依据和方向。对于数据集,不仅要使用MNIST数据集对改进的网络模型进行训练和测试,而且选用自制数据样本对该网络模型进行测试,以加强识别效果的可信度。实验结果表明改进后的模型在识别准确率、网络收敛速度等方面有所突破。最后将改进后的CNN实现手写数字识别模型应用与本校真实的试卷分数识别中取得了一定效果,为教学环节种智能化模式识别服务的实现做出一定的技术贡献。

2 基于CNN的改进手写数字识别

2.1 基于LeNet-5模型的改进

实验所使用的卷积神经网络模型是在LeNet-5模型的基础上改进而来。具体的改进内容及分析如下。

1)选择ReLU激活函数。ReLU激活函数使部分神经元的输出为0,一定程度上使卷积神经网络拥有稀疏特性,减少了参数数量,降低了网络计算量,使网络模型的训练更容易。

2)在池化层中改均值池化(mean-pooling)为最大池化(max-pooling)操作对数据进行池化处理。均值池化可以较好地保留图像的背景信息,而最大池化能够较好地提取图像的纹理信息。

3)添加批标准化函数BatchNorm2d。

4)对输入样本大小、卷积核大小及其数量、零填充等参数进行调整。卷积层中卷积核过大或数量过多会影响网络模型的训练速度;若相反会提取不到有效的特征信息。

2.2 本文算法

论文算法主要分为网络训练及测试和图像预处理两部分,其中网络训练算法步骤如下。

1)将MNIST训练样本图片输入改进的卷积神经网络;

2)对网络中的学习率、数据处理方式进行初始化,并设置损失函数;

3)逐层计算网络各隐藏层的输出值;

4)计算各网络层的误差损失;

5)利用反向传播进行参数更新;

6)更新训练样本并判断是否达到迭代次数,若达到,则网络训练结束;否则继续之前的步骤,反复更新网络参数,直到满足要求;

7)将自制测试样本进行像素取反成为黑底白字图片;

8)调用rectangle函数,选定图片中数字轮廓并裁剪;

9)对裁剪图片进行20*20缩放;

10)调用copyMakeBorder函数将图片零填充为28*28大小;

11)将经过预处理的测试样本输入已经训练好的网络中,并得出分类结果。

3 实验结果与分析

3.1 数据集及预处理

1)MNIST数据集

MNIST包含70000张图片,分为有60000张图片的训练集和有10000张图片的测试集。

2)自制数据集及其预处理

自制数据收集了不同人的手写数字体来作为样本,每张图片在其命名中标记对应的数字,以此作为该图片的标签。经过与MNIST数据集相同的预处理,自制数据集中图片的数字大小均为20*20,然后归一化为28*28。自制数据集预处理步骤及方法如下:

(1)将图片转为黑底白字:调用Abs函数对图片像素进行取反操作。

(2)将图片中的数字轮廓选定出来:调用Find⁃Contours函数将选定数字轮廓,再调用Rectangle函数画出轮廓区域。结果如图1所示。

图1 数字轮廓选定

(3)对图片中的数字区域进行裁剪:调用boundingRect函数保存数字轮廓的坐标,根据坐标对图片进行裁剪。

(4)对裁剪下来的数字图片进行缩放:调用cv2包中的resize函数进行20*20的缩放。

(5)将经过缩放的图片零填充为28*28大小的图片:通过调用cv2包中的copyMakeBorder函数对图片进行零填充。结果如图2所示。

图2 零填充后的图片

3.2 不同网络模型及其训练结果对比

文章对LeNet-5模型进行改进操作,其中包括增加和修改所用函数、调整网络模型参数等,用形成的各个网络模型进行实验,并对网络模型的结构性能和训练结果进行了对比分析。

1)不同结构的网络模型对比

对四种不同结构网络模型的结构及训练结果作比较,如表1所示。

表1 四种网络模型结构及训练结果比较

比较结果验证了ReLU激活函数解决Sigmoid函数的易饱和、均值非零的问题后可以很大程度上提升网络模型识别的准确率。从提升的准确率上可以发现,最大池化方法的使用确实让卷积神经网络模型提取到了更能表达图像纹理信息的数据。

通过对卷积神经网络模型LeNet-5不同方式的改进,搭建出不同的网络模型,并使用MNIST数据集作为对网络模型进行训练和测试,同时记录各模型的损失率,使用TensorBoard工具将损失率曲线可视化。图3为各模型损失率对比图。

图3 各模型损失率对比图

研究表明LeNet-5网络模型中Sigmoid函数和均值池化方式不能使网络模型收敛;CNN-1模型的损失率有明显的下降趋势,但收敛时间却很长;CNN-2模型的损失率明显优于CNN-1模型;CNN-3模型的性能最优。

2)不同参数的网络模型对比

文章对CNN-3模型设置了四种不同的参数进行测试。参数4对应的模型准确率高达到98.35%,将其命名为CNN_S。CNN_S模型包括两层卷积层C、两层池化层S和三层全连接层fc共7层结构,并在层间添加了BatchNorm函数和ReLU激活函数。调参效果对比如表2所示。

表2 CNN-3模型不同参数及训练结果比较

3.3 Tensor Board实现可视化

对CNN_S模型进行训练后,可以对网络训练的情况进行可视化输出。例如通过记录每个epoch的梯度值来监测网络训练过程,可以分析出权值的更新方向并判断其是否符合规律,继而对神经网络学习率做出设置和调整。

1)特征图可视化

原始图像输入卷积神经网络后,每经过一层网络层都会进行相应的操作。CNN_S模型中使用了ReLU激活函数,因此特征图经过了激活函数作用。图4为手写数字3在经过网络模型各层结构时形成的特征图。

图4 手写数字3特征图

2)梯度更新

在神经网络的训练过程中,梯度消失、梯度爆炸等问题可以采用记录每个epoch的梯度值的方式来监测并以此做出问题解决。在直方图中,x轴表示变量大小,y轴为训练的次数,随着训练次数的增加曲线颜色由深到浅。直方图可以很直观地显示出每个epoch训练时,变量值的大小。

卷积层中权重曲线随着训练次数的增加是条曲线,说明权重值随着网络的训练也在变化,如果是直线表示网络模型没有进行有效的训练。在进行网络训练的过程中,训练数据经过每一层时都会进行层操作,进而发生权重、偏置的更新变化。经过良好训练的网络权值、偏置往往表现为曲线美观、光滑;反之,训练不良好的网络则表现为多噪声,或缺乏结构性的情况。C1层中权重weight的直方图如图5所示。

图5 C1层中权重weight的直方图

3.4 自制数据识别结果

PyTorch读取数据时,会读取图片数据和对应标签。因此经过预处理的图片数据在输入网络进行识别前,要将图片数据和标签数据保存在txt文件中。数据读入网络中,通过计算预测值与数据标签相比较,可以得到识别准确的图片数量。图片识别准确率等于识别正确的数量除以数据总数。将经过处理后的数据图片输入网络进行识别测试后,已经达到了99.2%的准确率,结果如图6所示。

图6 自制数据测试结果

4 试卷评分识别服务

文章中以试卷卷头手写分数为数据,使用CNN_S算法来研究实现手写数字识别应用方面的问题。实验结果表明,该算法可以准确识别试卷上的分数,验证了卷积神经网络在手写数字识别应用上的可行性。

1)主要预处理过程

试卷手写分数识别的首先需要获取试卷卷头上的每一个手写分数数字,其具体的操作步骤依次包括图片灰度化、二值化、图片取反、去除表格边框、数字区域提取、去噪声、数字字符分割、归一化等。对试卷分值图像取反前后及归一化效果如图7、图8所示。

图7 原始试卷卷头图像取反前后

图8 归一化

2)试卷手写分数识别的实现

对试卷中的手写分数进行预处理后使用CNN_S模型进行识别,并对识别出的成绩进行计算,得到的总成绩与原始试卷的成绩相同。识别后进行计算可以与卷面总分做对比,检测识别准确性。试卷成绩识别结果如图9所示。

图9 试卷成绩识别结果图

通过实验可以发现,CNN_S模型可以准确识别出试卷中的手写分数,验证了卷积神经网络实现手写数字识别在实际应用中的可行性。

3)生成自动登分系统

在实现了自动评分流程中的一系列关键技术之后,选用Tkinter模块开发了“忻州师范学院自动登分系统”,并通过相应组建于技术程序进行了连接,从而实现了自动化登分。自动登分系统的实现使登分环节的公平公正性得到加强。系统经历登录、选择评分对象后即可自动评分并将结果显示出来。部分界面如图10所示。

图10 系统部分界面

5 结语

文章提出的卷积神经网络模型在自制数据集上的误识率低至0.8%,验证了改进后的手写数字自动识别模型在实际应用中的可行性,但仍有一些问题有待后续研究。首先,改进后的模型对异数据集识别率存在差异,因此需要提升算法的泛化能力;其次,继续对文章所提出的网络模型进行改进,提升其识别率。在实验中,使用的数据为字迹清晰规整的数字,因此后期将尝试使用书写格式不规整的数字图像作为数据进行分数识别的实验,同时系统的实用性及功能的全面性也有待提升。在识别服务的过程中,可以将与多个数字相似度较高的数字对服务对象做出警示,以期人工干预,从而使自动化与人工相结合,使服务效果达到最佳。

猜你喜欢
手写卷积神经网络
基于全卷积神经网络的猪背膘厚快速准确测定
基于神经网络的船舶电力系统故障诊断方法
基于人工智能LSTM循环神经网络的学习成绩预测
基于图像处理与卷积神经网络的零件识别
MIV-PSO-BP神经网络用户热负荷预测
我手写我心
一种基于卷积神经网络的地磁基准图构建方法
基于3D-Winograd的快速卷积算法设计及FPGA实现
我手写我意
三次样条和二次删除相辅助的WASD神经网络与日本人口预测