高宇鹏 胡众义
关键词:Keras;卷积神经网络;MNIST数据集
随着社会发展,试卷分数、快递单据、财务票据阳银行票据等多个领域的手写数字信息越来越多,勾了减轻数据的人工计算与手动录入系统的工作量,手写数字识别技术逐步发展起来。陈龙等采用3P神经网络对MNIST数据集中的10000个样本进行仿真实验,取得97.2%识别率。宋晓茹等引人Sigmoid激活函数,采用深度神经网络,将识别率提高到97.9%。Qiao,Junfei等采用自适应深度Q学习策略将识别率提高到了99.18%。但是Sigmoid激活函数计算量较大,反向传播时容易出现梯度消失的情况,因此张哲等采用Relu激活函数代替Sigmoid,基于Tenso rflow框架,利用Softmax函数进行归一化处理,对MNIST数据集进行训练,将识别率提高为99.2%。Tensorflow框架对MNIST数据集进行训练,能取得较高的识别率,但是需要编写的代码较多,训练模型耗时较长,针对这种问题,杨永翌提出采用Keras模型构建卷积神经网络,采用Tanh激活函数,对MNIST数据集进行训练,取得98. 38%识别率。杨永翌采用Keras模型减少了代码,但是降低了识别率,郭梦洁同样采用Keras模型,利用Relu激活函数代替Tanh,结合Adam优化器,对MNIST数据集进行训练,识别率达到99. 25%。王梅等采用改进VGG-16和朴素贝叶斯方法对MNIST数据集进行训练,识别率达到99. 36%。余圣新等采用改进Inception卷积神经网络结构对MNIST数据集进行训练,识别率达到99. 45%。在Keras模型的基础上,对模型进行改进,对MNIST数据集进行识别,识别率达到99. 54%,取得较好效果。
1Keras模型
Keras是由Python语言编写的开源神经网络学习库。与Tensorflow相比,Keras提供了强大的神经网络API库,采用模块化的编程,缩减代码编写量,是深度学习中使用较多的模型之一。Keras主要有Sequential和Model两种模型。Sequential模型是Model模型的特例,它通过add()方法将多个网络层线性的堆叠,因此它又被称为序列模型。Sequential模型的第一层需要输入shape数据参数,其余层可根据第一层的shape数据依次推导,不需要接收数据。这种模式输入和输出都是单一的,层层之间关联简单,没有跨层关联,因此编译速度快,在简单的模型设计中使用较多。Model模型是针对复杂的神经网络而设计的一种模型,它采用多输入和多输出,通过model. layers添加各层信息,提供了共享层模型,实现训练模型代码的重用,在构建复杂神经网络中被经常使用。
2激活函数
激活函数将非线性模型引入神经网络中,强化了神经网络的模拟和学习能力,在训练复杂类型数据时,激活函数起着非常重要的作用。常用激活函数有Sigmoid、Tanh和Relu函数。
2.1Sigmoid激活函数
文献[2]在手写数字识别过程中,采用的激活函数为Sigmoid函数。Sigmoid函数的公式为:
2.2Tanh激活函数
文献[6]基于Keras模型,采用Tanh作为激活函数。Tanh函数被称为双切正切函数,其公式为:
图2为Tanh函数的曲线图,可以看出Tanh函数与Sigmoid相比较,Sigmoid函数的输出值都大于0,减慢了模型的收敛速度。Tanh函数的输出值为[-1,1],与Sigmoid函数相比较,Tanh函数提高了模型的收敛速度。
从推导而得的公式3可知,Tanh函数相当于Sigmoid函数的变形,从本质上并没有解决梯度消失的问题,因此Tanh函数也不适合深层次神经网络模型的构建。
2.3Relu激活函数
Relu激活函数是目前应用比较多的一个函数,它的公式为:
从图(3)、公式(4)和公式(5)可知,Relu激活函数其实就是一个求最大值的分段函数。当x的取值小于或等于O时,Relu函数不被激活,输出为0;当x的取值大于O时,Relu函数被激活,取值为x。Relu函数没有饱和区域,所以不存在梯度消失的情况,由于输入值x为负时,Relu函数不被激活,意味着同一时刻只有部分神经元被激活,使得网络变得比较稀疏,与Sigmoid和Tanh函数相比,Relu函数提高了训练模型的效率和收敛的速度。因此改进的算法中采用的激活函数为Relu函数。
3基于Keras构建CNN手写数字识别模型的改进
3.1卷积神经网络结构的改进
卷积神经网络的英文全称为ConvolutionalNeural Network(CNN),是由加拿大神经科学家Hubel和Wiesel在研究猫脑皮层的神经元时提出。其主要思想是局部卷積、权值共享、空间或时间上的采样,其中卷积操作是卷积神经网络的核心。卷积操作就是利用卷积核对特征图像的像素点按照从左到右的滑动方向进行局部卷积运算,从而提取每一层图像的局部特征(Feature Map)。卷积运算的公式如下所示:
一般卷积神经网络的结构主要由卷积层、池化层和全连接层的重复组合。文献[6]在卷积神经网络结构设计中,由两个卷积层、一个池化层和两个全连接层组成,图4描述了文献[6]采用的传统的卷积网络。首先对28*28的灰度图像进行3*3的两次卷积操作,得到64个24*24的图像;然后通过2*2的池化层操作,变为64个12*12的图像;最后加入2个全连接层(1个为激活函数为Relu,1个回归函数为Softmax),输出训练的结果。
但是在实际的卷积操作过程中,每经过1次卷积操作就会增加1次训练参数。传统的卷积网络结构在第1次卷积操作后,参数个数为320;第2次卷积操作后,参数个数达到了18496;经过2次全连接后,最终参数个数为1199882。过多的参数增加了训练时间,同时会造成过拟合情况。基于此,在传统的卷积网络结构的基础上进行了结构的改进,采用两个卷积层、两个池化层和两个全连接层构成。首先对28*28的灰度图像进行5*5卷积核操作,采用2*2模型进行池化操作;其次进行3*3卷积核操作,采用2*2模型进行池化操作,为了防止参数过多造成的过拟合,加入了Dropout层,丢弃50%的神经元,简化了参数;最后进行3次全连接(2次激活函数为Relu,1次回归函数为Softmax),输出训练的结果。改进后的卷积网络结构如图5所示。
3.2实验结果分析
改进模型采用的实验环境为:Windowsl0的操作系统,InteI(R)
Core (TM)i7-4700的CPU,16GP的内存容量,NVIDIA GeForce RTX 2070的GPU;Anaconda3下的Jupyter工具;基于python语言的Keras框架。实验中采用的数据集为目前常用的MNIST数据集,对文献[6]中传统的卷积网络结构和采用的改进卷积网络结构进行了测试对比分析。
表1为采用传统的卷积网络结构实验数据。首先进行了2次卷积操作,得到18496个训练参数;然后经过1次池化层操作,加入Dropout防止过拟合,丢弃25%的神经元,并加入Flatten展平层,将训练的数据展平为适合的网络结构;再次进行了1次激活函数为Relu的全连接层和1次回归函数为Softmax的全连接层,中间又加入了Dropout防止过拟合,丢弃25%的神经元,实验最后总的训练参数为1199882。
表2为采用改进卷积网络结构的实验数据。首先进行了1次卷积操作,得到832个训练参数,经过1次池化层操作;其次再进行了1次卷积操作,得到4624个训练参数;经过1次池化层操作;然后加入Dropout防止过拟合,丢弃50%的神经元,并加入Flatten层,将训练的数据展平为适合的网络结构;再次进行了2次激活函数为Relu的全连接层和1次回归函数为Softmax的全連接层,实验最后总的训练参数为63744。
改进的模型以MNIST数据集的60000个训练集和10000个测试集为基础,以acc(训练集准确率)、val_acc(测试集准确率)、loss(训练集损失率)、val-loss(测试集损失率)为评估参数,对传统的卷积网络结构和改进的卷积网络结构进行仿真实验。实验中数据训练的迭代次数epoch为50次,每次的样本数量batch_size为256,图6和图7分别为传统的和改进的acc和val acc的结果。由于传统的acc都未超过98%,因此图6只显示出了val_acc的值。传统的最终的val_acc值为99.25%,改进的最终val_acc值为99. 54%;传统的结构在迭代20次以后val acc的值才超过了99.1%,而改进模型在迭代9次以后val_acc的值就全部超过了99. 1%;因此采用改进后的卷积网络结构收敛要快于改进前的速度,测试集的准确率要高于改进前的准确率。
图8和图9分别为传统和改进的loss和valloss的结果。传统的val_loss都高于2%,改进模型中迭代30次以后的val_loss值都低于2%,最终
表3为改进前和改进后结构实验中val_acc和val_loss的数据,以迭代10次、20次、30次、40次和50次的样本数据为例。从表3中可以看出,经过50次的迭代,采用卷积网络结构比改进前卷积网络结构的val_acc提高了0.29%、val loss降低了0. 77%。且在迭代第10次时,改进后比改进前的val_acc提升了0.29%,val loss降低了0.8%,说明采用改进的结构收敛速度要快于改进前的收敛速度。
4结论
基于Keras框架,对卷积神经网络的结构进行改进,以MNIST数据集为基础进行仿真实验。实验结果表明:改进的卷积神经网络结构与改进前相比较,提高了训练集和测试集上的准确率,最终在测试集上的准确率为99. 54%;降低了训练集和测试集上的损失率,最终在测试集上的损失率为1.62%;且收敛速度快,训练参数也少于改进前的训练参数,对手写数字识别的研究有重要意义。后续需要继续研究结构和算法的改进,进一步提升测试集的准确率。