张趁香 陈黄宇
关键词:手写数字识别;LeNet-5;深度学习;卷积神经网络;激活函数
0 引言
随着人工智能及相关技术的发展,信息存储和传递方式的改变在一定程度上解决了人类面临的多种问题,例如信息因距离远而传输缓慢,或信息过于庞大或复杂而难以传递的困难。数字识别技术,作为一种新兴的、利用计算机代替人类识别手写数字的技术,已经得到了广泛的应用。从航空航天、工业制造、铁路装备到精密仪器、芯片制造、显微成像,各行各业都有数字的身影。本文旨在设计一种能够快速、准确识别数字的算法,并将其实际运用到各领域中解决问题。
1 神经网络方法解决手写数字识别问题现状
目前,大量的神经网络方法被利用于解决手写数字识别问题。传统的神经网络是一种机器学习方法,它通过正向的神经元计算预测值与实际样本之间的偏差,并通过反向传播机制(BP) 来更新神经网络中的参数,从而达到训练模型的目的,以准确判断手写数字类型[1]。BP神经网络自提出以来,因其强大的非线性拟合能力而被广泛应用。然而,该网络结构中的参数优化方法存在不足,在实际训练中,很难实现有效的收敛性和训练效率。此外,由于硬件资源的限制,训练效率进一步降低,在较大规模的网络中难以提供充分的运算资源进行参数优化。
为了更好地识别和分类,常采用卷积神经网络(CNN) 。该网络是基于传统神经网络改进后设计的,结合了人类大脑理解视觉图像的方式[2]。相比于原有的网络结构,卷积神经网络提出了一种类似于人类识别事物时的观测方式:感受野(receptive field) 。首先,它通过卷积运算来捕捉各个部位的特征,把注意力集中在一个特定区域上。其次,权重共享的核心在于,相同的特征抽取方法可以应用于其他图像。最后,在卷积层后加入了一个池化层,它可以从卷积运算中提取特征值,进一步减少参数量和特征向量的维度,从而提高学习效率。由于卷积神经网络更适合处理图像数据,BP神经网络通常将图像信号展开为一维信号,这一过程会导致图像中各像素之间的关联信息丢失;而卷积神经网络则直接将原始图像作为输入,或对图像进行预处理,以保持图像中邻近像素的关联性。
2 改进LeNet-5的手写数字识别
尽管BP神经网络在手写数字识别领域未能达到特别高的识别精度,基于卷积神经网络实现的手写数字识别系统LeNet-5在MNIST数据集上的测试误差仅为0.94%,相比之前的算法在精度方面已有一定提升。然而,传统的LeNet-5模型采用的Sigmoid激活函数[3]可能在实际模型训练过程中导致梯度消失现象。此外,网络结构的设计也不足以训练出高精度的模型。
2.1 对网络结构进行变更
1) 原模型中采用Sigmoid函数作为激活函数,经过BP神经网络的实验验证,ReLU函数具有更佳的性能,因此采用ReLU函数替代原有的Sigmoid函数。
2) 在LeNet-5中,第二个卷积层与上一层之间采用了特殊连接方式,本文改为在所有特征图上直接进行卷积,以简化网络模型。
3) 在最后的全连接层和输出层之间加入dropout层,以防止过拟合。
4) 原LeNet-5模型使用欧式径向基函数进行分类,改为采用softmax分类函数进行分类。
2.2 改进LeNet-5模型
改进后的LeNet-5同样通过MNIST 数据集进行训练和测试。在此过程中,模型对原有图像进行预处理,将原本的28×28图像转换为32×32图像。这一变化旨在避免在卷积核与原始图像之间的信息丢失。与其他神经网络相似,该算法采用基于反向传播的随机梯度下降方法更新权重。与BP神经网络相比,由于卷积层与其输入之间是稀疏连接的,并且每个卷积核只提取原图不同位置的相同特征(即权值共享),这种处理显著减少了训练所需的参数数量。此外,通过增加卷积核的数量可以提取更多的特征。改进LeNet-5网络结构如图1所示。
1) 根据网络中对卷积运算的处理方式,若输入的特征图大小为28×28,且未采用任何填充策略,且步长设为1,则使用5×5大小的卷积滤波器执行一次卷积后,生成的特征图将变为24×24。同样,若使用3×3大小的卷积滤波器进行同样的卷积,将产生一个26×26 大小的特征图。最后,再次使用3×3的卷积滤波器进行卷积,最终生成的特征图大小仍为24×24。从这些数据可以明显看到,无论是否重复使用3×3的卷积滤波器,结果得到的特征图尺寸都是相同的。这一结论可以通过观察表1中的参数变化来得出。
2) 需要增加同一层中的卷积核数量。在每个卷积层中,应使用32个卷积核进行计算。这样做可以增加每层输出的特征图数量,从而增强模型的特征提取能力,进而提升模型性能。
3) 采用ReLU激活方式替代了Sigmoid激活方式。通过选择适当的激活机制,可以显著提升模型的表现力。从图2可以看出,在相同的学习条件下,相较于Sigmoid激活方式,ReLU激活策略能够减少训练回合次数,并将误差值降低至0.25。
4) 利用空间金字塔池化(Spatial Pyramid Pooling) 技术改进LeNet-5中的S4池化层,以减小池化过程对特征值的影响。具体来说,图3展示了低层次和高层次的立方体分别表示的是卷积层产生的特征图。接着,这些特征图被传递到三个不同尺寸的池化层(4×4、2×2和1×1) ,最终将这三个结果合并成一个21维的向量,然后传递到全连接层。
5) 采用全连接层替代LeNet-5中的C5层。通常情况下,全连接层被置于模型末端,以汇总信息并防止因过分关注局部信息而导致的分类误差,这有助于提升网络的稳健性。通过优化,发现在前三个卷积层之后,即使不减少卷积层数量,也可以用全连接层取代C5 层,从而进一步增强模型的稳定性和分类准确率。
在网络训练过程中,使用随机优化算法初始化卷积神经网络中所有卷积核的权值wij,旨在为正在学习的数据中的输入到输出的特定映射函数找到足够好的权重集[4]。随后,将输入图像送入卷积神经网络进行前向传播,以获取网络的输出。通过计算损失函数来衡量网络输出与真实标签之间的差异,并通过反向传播将这一差异从输出层传递回上一层,以此初始化网络中的卷积核参数值。接着,选择优化器算法生成新的样本,并反复更新网络中的参数,从而使损失函数逐渐减小。
2.3 多维卷积运算
由于原始输入图像包含RGB三个通道的数据,因此卷积核需要具有相匹配的深度,以便更有效地对特征进行组合。多维卷积有两种方式:一种是全卷积,即同一层的所有特征图都参与卷积运算,但这种方式并没有突出特征组合的特殊性;另一种是选择性卷积,在这种方式中,人为地约束了哪些特征图进行组合,使得某些卷积核只关注部分特征之间的组合,而不是全自动地学习该组合哪些特征。在LeNet-5中,C3层和S2层采用选择性卷积,目的是让模型只选取特定部分的特征进行组合,这样同时也降低了参数数量,简化了网络模型[5]。多维卷积运算的示意图如图2 所示。
2.4 池化和激活函数
池化可以对数据进行降维,同时可以缩小数据量,减小实际训练过程中的压力。实验证明,池化操作不仅不会丢失特征,反而可以减少参数,使得训练速度加快。此外,特征向量维数的降低有利于分类器的训练。池化操作和卷积的相同之处在于都是通过一个滑动窗口对输入进行运算,然后再加上一个偏置项;不同之处在于滑动窗口的选择以及其中参数的确定。
按照运行方式,池化可以划分为最大池化、平均池化和随机池化。在最大池化过程中,通过池化操作,得到的结果是滑动窗口覆盖区域内的最大单元。在平均池化中,通过计算,可以获得由滑动窗口所涵盖的单元的平均值。在池化具体操作过程中,一般选取池化窗口时需要使窗口大小能被原图大小整除,即当滑动窗口以自身大小为步长在特征图上滑动后,能够覆盖特征图中所有的像素点。例如,28×28大小的特征图经过2×2窗口池化之后,得到的特征图大小为(28/2) ×(28/2) ,即14×14。由此可以明显地看出,特征图在原基础上被抽象,且特征图的维数大大降低,网络训练速度自然会有所提升。
激活函数主要起到“映射功能”。在神经网络中,大多数操作都是线性的,为了适应某些非线性问题,必须使用激活函数。激活函数大体可以分为两大类:
1) 饱和激活函数:sigmoid、tanh。
2) 非饱和激活函数:ReLU、Leaky ReLU等。
使用“非饱和激活函数”的优势主要有:它能在一定程度上解决反向传播过程中的计算问题,例如梯度消失的问题。由于其本身的特点及计算的非线性等特征,可以加快运算速度。因此,在本网络中采用的是Leaky ReLU。其数学表达式为:
不同结构的神经网络效果各异。在每次训练过程中,隐含层的神经元会以一定概率随机失活,因此无法保证每两个隐含层神经元在每次训练中都同时出现。这种机制使得权值更新不再依赖于具有固定关系的隐含层神经元的共同作用,避免了某些特征仅在其他特定特征出现时才有效的情况[6]。由于每次训练时部分神经元不参与权值更新,实际上每次训练的都是一个不同的网络。
3 GUI 界面设计及实验
3.1 GUI 界面设计
GUI 界面是通过Python 自带的PyQt 包开发的。PyQt是一个强大的Python工具包,它不仅可以用于界面开发,还可以进行简单的程序可视化展示。主要功能及其说明如表3所示。
3.2 实验设计
LeNet-5手写数字识别训练步骤如下:
1) 将遵循正态分布的120维随机向量传送至生成器的全连接层,然后利用随机优化算法为各种卷积核选择参数wij。在卷积神经网络中,所有卷积核权重均被初始化,并输出7×7×512个神经元,以便为正在学习的数据中的输入到输出的特定映射函数找到足够好的权重集。经过ReLU激活函数的非线性映射后,并进行尺度归一化处理,输出至第一个转置卷积层。
2) 将输入数据传送到卷积神经网络中进行前向传播,运行Step设置为1,补零参数设为flag,然后进行卷积运算,输出256个7×7大小的张量。经过ReLU激活函数的非线性映射后,并进行尺度归一化处理,输出至第二个转置卷积层。
3) 将输入数据传送到卷积神经网络中进行前向传播,运行Step设置为1,补零参数设为flag,然后进行卷积运算,输出128个14×14大小的张量。经过ReLU 激活函数的非线性映射后,并进行尺度归一化处理,输出至第三个转置卷积层。
4) 将输入数据传送到卷积神经网络中进行前向传播,运行Step设置为2,补零参数设为flag,然后进行卷积运算,输出1个56×56大小的张量。经过ReLU激活函数的非线性映射后,输出生成对象。
5) 重复以上判别过程,计算损失函数以衡量网络输出与真实标签之间的差异,将这个差异通过网络反向传播,更新网络中的参数。一方面的数据来源于MNIST数据集,另一方面的数据来源于生成器输入的数据。将两种数据输入的损失值相加后,对判别器的模型进行优化。
3.3 实验结果对比分析
实验采用批量梯度下降法进行网络权值的更新,每一批次的样本数为120个,设置循环次数为20次,则权值更新次数为60000/120×20=10000次,在训练过程中,每经过500次迭代就将训练的中间网络用于测试集进行测试。由于训练刚开始的时候,权值是随机初始化,模型在测试集上的效果不具备代表性,故而没有进行记录。
Minst数据集预测部分数据结果直观展示图如图4所示。
根据LeNet-5的结构特点,本文对其结构进行了一些改变:替换激活函数、增加卷积核的数量以及加入dropout。实验结果证明了这些结构改动的有效性。通过对误分类样本的观察分析,发现网络对于单一的MNIST训练集的泛化能力和精度已经难以进一步提升。为了进一步提高网络性能,可以增加样本输入量。针对测试集中某些类别存在的严重形变,可以对训练集中的样本进行适度的扭曲形变后再输入网络进行训练,这种方法变相地增加了训练样本的数量,也有助于增强网络的泛化能力。
4 结束语
首先,本研究对各种隐藏层参数和激活函数的变化进行了对比,比较了不同激活函数的利弊,发现以ReLU为激活函数的网络能够快速收敛;在过度拟合的条件下,添加dropout能够稍微减轻过度拟合的问题。其次,本研究通过利用改良的LeNet-5架构进行手写数字识别的方法进行了探索。研究结果表明,随着卷积核数量的增加,虽然可以提高特征的维度,从而提升网络的整体性能,但卷积核的数量并非越多越好;过多的卷积核不仅会导致巨大的计算开销,还可能引起网络的过度拟合。最后,通过改变LeNet-5的结构,将错误识别率降低到了0.86%。