发明内容
为克服现有技术的不足,减少网络计算量的同时,提高网络的识别率,本发明提出一种用于手写汉字识别的深度神经网络的加速方法。
本发明的技术方案是这样实现的:
一种用于手写汉字识别的深度神经网络的加速方法,包括步骤
S1:构建并训练出一个针对脱机手写汉字识别卷积神经网络;
S2:根据所需加速的倍数,计算低秩分解后第一个卷积层输出特征图的数目;
S3:针对逐层分解的卷积层进行训练;
S4:对所述用于手写汉字识别的深度神经网络进行重新训练,从而进行微调;
S5:编写所述用于手写汉字识别的深度神经网络的前向代码。
进一步地,步骤S1包括步骤
S11:设计所述深度卷积神经网络的结构,设置卷积层、池化层和全连接层参数,选取激活函数;
S12:将训练集的数据作为深度卷积神经网络的输入,采用随机梯度下降法对深度卷积神经网络进行训练,当深度卷积神经网络在训练集上的误差完全收敛时,终止训练,保存深度卷积神经网络各个层的参数。
更进一步地,步骤S11中每个卷积层与激活函数的之间以及第一个全连接层与激活函数之间添加有批归一化层,所述激活函数采用PReLU。
进一步地,步骤S3包括步骤
S31:在分解后的第一个卷积层输出后面,加上Batch Normalization和PReLU层;
S32:从第二个卷积层开始低秩分解,把第二个卷积层以及接在其后面的BatchNormalization和PReLU层,用两个较小的同样在其后面接有Batch Normalization和PReLU层的卷积层代替,用初始训练的模型参数对其他层进行初始化,然后将其学习率设置为0,最后采用随机梯度下降法对整个深度卷积神经网络进行训练,直至深度卷积神经网络收敛;
S33:对第三个卷积层进行低秩分解,此时除了此时要低秩分解的层和已经低秩分解过的层以外,将其他所有层的学习率设为0,在开始训练,直至收敛,然后按照依次将后面的卷积层进行低秩分解。
进一步地,步骤S4包括步骤:所有需要低秩分解的层分解完毕之后,在用保存下来的参数对各层进行初始化,对深度卷积神经网络重新进行训练,达到微调的效果。
进一步地,步骤S5包括步骤
S51:编写卷积层的前向代码;
S52:编写池化层的前向代码;
S53:编写全连接层的前向代码。
本发明的有益效果在于,与现有技术相比,本发明具有以下有益效果:
破除了传统的基于改进二次判别函数(MQDF)的分类器文字识别方法,采用深度卷积神经网络针对手写文字识别,并且将Batch Normalization和PReLU引入到网络设计之中,显著提高网络的识别率;
采用基于低秩分解的加速方法,创造性的把Batch Normalization和PReLU层加在分解的各个层的后面,加速网络收敛,增加网络的拟合能力,而且其引入的计算量和参数量可以忽略不计;
提出了一套全新的训练框架,在减小网络的计算量时,对识别率的影响不大,在采用脱机汉字手写数据库CASIA-HWDB1.0与CASIA-HWDB1.1作为训练集,off-ICDAR2013作为测试集,初始网络取得了97.30%,计算复杂度减少四倍后依旧取得了97.25%的结果,仅仅下降了0.05%,而且这两个结果均是公开发表在该数据集上单个模型的最高结果。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明主要解决基于卷积神经网络的脱机手写汉字识别速度太慢的问题,对卷积层、池化层以及全连接层计算的特点进行分析,提出相应的策略,对卷积层采用低秩分解的策略,将之前较大的卷积层的计算转化两个较小卷积层的计算,然后采用矩阵的相乘进行计算,对于池化层和全连接层,我们采用循环展开的策略对其进行优化,同时采用了BatchNormalization以及Parametric Rectified Linear Unit(PReLU)提出一套全新的加速卷积神经网络的训练方法,在此框架下,在减少网络计算量的同时,识别率略微下降。整体流程如图1所示:
本发明包括步骤:S1:设计并训练一个适用于脱机手写汉字识别的卷积神经网络;S2:根据所需加速的倍数,计算低秩分解后第一个卷积层输出特征图的数目;S3:出了一种对卷积层逐层分解的训练方法;S4:对整个网络进行重新训练,从而进行微调;S5:编写网络的前向代码。具体来说,先设计出一个网络进行训练,得到一个初始的模型,然后根据各个卷积输入输出的大小以及卷积核大小和加速的倍数,从而计算出各个要低秩分解的卷积层分解后中间层特征图的输出,在依据我们提出逐层分解的策略,对网络进行逐层训练,需要低秩分解层都分解后,在对整个网络进行从新训练,进行微调,最后在根据根据各个层的计算,编写网络的前向代码。
以下分别对本发明的主要步骤进行详细说明。
步骤S1:设计和训练出一个用于脱机手写汉字的卷积神经网络,包括步骤
S11:设计深度卷积神经网络模型。
在本发明中,设置的深度卷积神经网络模型结构,其输入为1×96×96,其一共包含五个卷积层,每个卷积层的卷积核大小均为3×3,卷积的步长设为1且在特征图的四周均有加一的补全,这可以使得特征图经过卷积操作后大小不发生变化;其包含四个最大池化层,其中池化核的大小3×3,其步长为2,每经过依次池化之后特征图的宽高均将减半;包含一个全连接层,其输出神经元的个数为1024;最后是一个输出层,输出3755类;其中值得说明的是,在每个卷积层和全连接层后面均接有Batch Normalization层以及采用PReLU作为激活函数。初始网络的整体结构表示为:
Input-
96C3-MP3-128C3-MP3-160C3-MP3-256C3-256C3-MP3-384C3-384C3-MP3-1024FC-Output
S12:对设计好的网络进行训练。
训练时做分类问题,采用随机梯度下降法对网络进行训练,训练时包括前向传播和反向传播两个步骤,前向网络传播网络的误差,反向传播对各个层的参数进行更新,对网络的参数不断进行优化。在进行训练时,每训练一万次时,都会用此时模型将测试集的数据全测试一遍,最后取测试时获得最高结果的模型保持下来。
步骤S2:根据所需加速的倍数,计算低秩分解后第一个卷积层输出特征图的数目。包括步骤
S21:通过已知低秩分解之前卷积层的计算复杂度以及需要加速的倍数,来计算低秩分解之后第一个卷积层输出特征图的数目
低秩分解的示意图如图2所示,可知某卷积层的输入输出特征图为与中C和N为输入与输出特征图的数目,H与W为输入特征图的高与宽,H′和W′为输出特征图的高和宽,卷积核为一个四维向量其中卷积核的大小为K×K,由卷积的定义可知,有
其计算复杂度为:O(CNK2H′W′)。
经过低秩分解之后,将输入特征图与卷积变成,输入特征图与卷积后,,其中D为该层输出特征图的数目,有
其计算复杂度为:O(CDKH′W)
得到的与进行卷积,又有
其计算复杂度为:O(NDKH′W′),所以低秩分解之后的总计算复杂度为:O(DKH′(NW′+CW))。
所以,如果我们想对某层的加速x倍,D的值应该被设置为:
S22:计算各个需要低秩分解的卷积层,分解后第一个卷积层输出特征图的数目。
一般来说,由于网络第一个卷积层的冗余度是较小的,计算量也不是很大,所以我们从第二个卷积层开始,根据公式(4),计算需要低秩分解层D的值。对我们的网络减少4倍的计算复杂度,低秩分解前后各个层的特征图数目如表1所示。
步骤S3:对卷积层进行逐层分解训练。包括步骤
S31:对原始低秩分解策略的改进。
正如图2所示,原始的低秩分解策略是将一个卷积层分解层两个连续卷积的卷积层。在这里,我们区别于这种做法,正如图3所示,我们对某个卷积层进行低秩分解时,在分解的第一个卷积层输出后面,我们同样也加上Batch Normalization和PReLU层,使得我网络中每个卷积层后面都会接有Batch Normalization和PReLU层,这样可以明显加速网络收敛,增加网络的拟合能力。
S32:训练出低秩分解后卷积层的参数。
训练过程如图4所示,当原始的模型训练好之后,我们从第二个卷积层开始低秩分解,用低秩分解之后的两个卷积层,取代低秩分解之前的卷积层,其它未被改变的层的参数用预训练好的模型参数进行初始化,然后在其的学习率固定为0,让其参数值停止更新,对整个网络进行训练,直至网络收敛。低秩分解前后各卷积层特征图的数目如表1所示。
表1:低秩分解前后各卷积层特征图的数目
S33;对整个网络进行低秩分解训练。
当第二个卷积层低秩分解完成后,我们继续对接下来的卷积层逐层进行低秩分解,如图4所示,对已经低秩分解的层和未做改变的层,用上次低秩分解结束的模型参数对其进行初始化,同样对未做改变的层的学习率固定为0,停止其参数更新,对整个网络进行训练,直至收敛。
步骤S4:对整个网络进行重新训练,从而进行微调。
由于在低秩分解卷积层时,第一个卷积层和全连接层以及输出层的参数始终是固定住的,所以当把所有需要低秩分解的层进行低秩分解之后,在用之前保存下来各个层的参数对网络进行初始化,对网络重新进行训练,进一步提高网络的识别率,达到微调的效果。
步骤S5:编写网络的前向代码。包括步骤
S51:针对卷积层的前向代码编写。
针对卷积层来说,由于存在大量的点乘操作,采用直接计算的方法计算速度较慢,在这里,我们采用im2col算法,将卷积计算转为为矩阵相乘的计算,然后采用经过数学上优化过的矩阵相乘库,对其进行优化,大幅减少其计算时间;
S52:针对池化层的前向代码编写。
针对池化层来说,由于我们采用的是最大池化层,主要的计算为在几个值中找到最大值,由于存在频繁的读数据和写数据操作,故采用循环展开策略;
S53:针对全连接层的前向代码编写。
针对全连接层来说,由于是一个列向量和一个矩阵的相乘,采用矩阵相乘的做法效果不太明显,故也采用循环展开策略对其进行优化计算。
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围。