一种融合ReLU激活函数与最大值池化的向量化实现方法与流程

文档序号:11655049阅读:1470来源:国知局
一种融合ReLU激活函数与最大值池化的向量化实现方法与流程

本发明主要涉及到卷积神经网络技术领域,特指一种融合relu激活函数与最大值池化的向量化实现方法。



背景技术:

20世纪60年代,hubel和wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈神经网络的复杂性,继而提出了卷积神经网络(convolutionalneuralnetwork,cnn)。当前,卷积神经网络已经成为众多学科领域的研究热点之一,特别是在模式分类领域,由于该网络避免了对图像的复杂前期预处理,可以直接输入原始图像,因而得到了更加广泛的应用。

一般地,一个典型的卷积神经网络计算模型包括卷积层、池化层、全连接层以及后续的分类器,如支持向量机(supportvectormachine,svm)。其中卷积神经网络模型中涉及到的计算类型主要有:矩阵的卷积计算、激活函数的处理;如,线性激活函数f(x)=x或者非线性激活函数等,以及矩阵的池化操作,包括最大值池化(maxpooling)和平均值池化(averagepooling),最后通过矩阵运算和某些超越函数的处理最终对卷积神经网络的模型的输出进行预测,完成相关物体识别的过程。由于卷积神经网络模型是由不同的卷积层和池化层交替迭代,因此卷积神经网络模型的计算量非常巨大。为此,如何加速该模型的计算效率在当前学术界和工业界都是一个重要的研究内容。

当前卷积神经网络模型中采用的激活函数模型主要包括线性激活函数和非线性激活函数两大类,大约有十几种之多,而修正线性单元,即relu(rectifiedlinearunits,relu)激活函数正是其中最常用的一种,其数学表达式为f(x)=max(0,x),可以看出当输入信号x小于0时,输出都是0,大于0时,输出等于输入。relu函数的突出优点是,单侧抑制;相对其他激活函数宽阔的兴奋边界,具有稀疏的激活性等特性。在神经科学方面,神经科学家还发现了神经元的稀疏激活性,2001年,attwell等人基于大脑能量消耗的观察学习上,推测神经元编码工作方式具有稀疏性和分布性,2003年lennie等人估测大脑同时被激活的神经元只有1~4%,进一步表明神经元工作的稀疏性。从信号方面来看,即神经元同时只对输入信号的少部分选择性响应,大量信号被刻意的屏蔽了,这样可以提高学习的精度,更好、更快地提取稀疏特征。因此,从稀疏性这个角度来看,relu函数成了近似符合人类神经元模型的最佳模型。

卷积神经网络模型中,图像数据在经过激活函数处理后,需要进行下一级的计算,即,池化操作,池化操作主要包括最大值池化和平均值池化,最大值池化是指取出池化窗口中的最大值作为该池化窗口的输出,而平均值池化是指取出池化窗口中所有元素的平均值作为该池化窗口的输出。不管是平均值池化还是最大值池化,其目的都是为了在不大幅度影响模型识别精度的前提下最大程度的降低图像矩阵的维度,降低计算量,同时也为了避免模型出现过拟合现象。

卷积神经网络是当前高性能计算中常用的计算模块之一,是典型的访存密集型和计算密集型应用,对处理器的计算部件和访存带宽要求非常高,计算复杂度很大,当前主流的加速平台有基于gpu的卷积神经网络计算平台、基于fpga的卷积神经网络计算平台、基于专用神经网络加速器的计算平台、以及基于通用cpu或一些向量处理器来加速卷积神经网络模型的计算。向量处理器是一种多功能部件的处理器,一般包括向量处理部件(vectorprocessingunit,vpu)和标量处理部件(scalarprocessingunit),向量处理部件主要由若干个向量处理单元(vectorpocessingelement,vpe)组成计算阵列,主要负责向量计算,每个vpe包括若干mac0、mac1等多个同构运算功能部件,以及alu、位处理(bp)等其他功能部件;标量处理单元主要负责计算任务和流控,vpu和spu可以进行数据通道传输和交换。向量数据访问单元支持向量数据的load和store,提供大容量的专用向量存储体。



技术实现要素:

本发明要解决的技术问题就在于:针对现有技术存在的技术问题,本发明提供一种原理简单、实现方便、能充分挖掘向量处理器的并行计算能力及算法的并行性的融合relu激活函数与最大值池化的向量化实现方法,即通过融合relu激活函数和最大值池化操作来降低数据的访存量,进而缩短卷积神经网络的计算时间,提高卷积神经网络模型的计算效率。

一种融合relu激活函数与最大值池化的向量化实现方法

为解决上述技术问题,本发明采用以下技术方案:

一种融合relu激活函数与最大值池化的向量化实现方法,其步骤为:

s1:计算矩阵a的relu激活函数值;

s2:计算步骤s1中relu激活函数处理后的矩阵的最大值池化;

s3:重复步骤s1和步骤s2直至遍历完矩阵a的所有子块,最终完成整个矩阵a的relu激活函数处理和最大值池化操作。

作为本发明的进一步改进:所述步骤s1的具体步骤为:

s1.1设卷积操作后需要进行激活函数处理的矩阵为a(m,n),relu激活函数为f(x)=max(0,x),向量处理单元vpe的个数为p,取n为p、kx、ky的整数倍,最大值池化窗口为kx×ky;

s1.2使用向量vload指令取矩阵a的第一行元素;

s1.3使用向量比较大小指令vfcmpgd,比较向量寄存器的大小,比较结果的逻辑值放入条件寄存器中;

s1.4使用条件向量赋值指令vmov,取出步骤1.3中大于0的值放入向量寄存器中;

s1.5得出relu激活函数处理后的结果;

s1.6根据最大值池化窗口k,重复步骤1.2至1.5k次得出a矩阵k行元素的relu激活函数操作,结果保存在向量寄存器中,直接作为步骤s2中最大值池化的输入值。

作为本发明的进一步改进:所述步骤s2的具体步骤为:

s2.1取步骤s1.6中计算得出的k行元素,直接作为本次计算的输入;

s2.2将第1行元素与第2行元素作比较,比较结果的逻辑值放入条件寄存器中;

s2.3使用条件向量赋值指令vmov;

s2.4通过比较k-1次,得出k行元素对应的列最大值;

s2.5配置混洗模式,比较得出步骤s2.4中对应的k列元素的最大值;

s2.6最终同时得出p/k个池化窗口尺寸为kx×ky最大值池化结果。

作为本发明的进一步改进:所述步骤s2.5中的一个最大值池化结果c0,0的计算公式为:

其中c0,0为最大值池化结果矩阵中的第一个元素,kx、ky为池化窗口的尺寸,在卷积神经网络中,池化窗口为方阵,即kx=ky=k,ai,j为需要进行最大值池化的矩阵a中的元素。

作为本发明的进一步改进:所述上述步骤中定义池化窗口的大小为sizex、sizey,两个相邻池化窗口的水平位移或竖直位移为stride,最大值池化操作中池化窗口不重叠,即sizex=sizey=stride。

与现有技术相比,本发明的优点在于:本发明的一种融合relu激活函数与最大值池化的向量化实现方法,通过将relu激活函数操作和最大值池化计算融合成一个计算流程,避免了最耗时的中间计算数据的store和load,同时还充分利用向量处理器中的向量部件多个并行处理单元能同时进行相同运算操作的特点来进行大量的同类型操作,从而大幅度提高卷积神经网络模型的计算效率,且步骤简单,易于实现。

附图说明

图1是本发明方法的流程示意图。

图2是向量处理器的一般结构示意图。

图3是本发明在具体应用实例中2×2最大值池化示意图。

图4是本发明在具体应用实例中采用的rulu激活函数图像示意图。

图5是本发明在具体应用实例中relu激活函数向量化实现流程示意图。

图6是本发明在具体应用实例中2×2最大值池化向量化实现流程示意图。

图7是本发明在具体应用实例中最大值池化操作中池化窗口不重叠操作示意图。

具体实施方式

以下将结合说明书附图和具体实施例对本发明做进一步详细说明。

如图1和图4所示,本发明的一种融合relu激活函数与最大值池化的向量化实现方法,其步骤为:

s1:计算矩阵a的relu激活函数值;

s1.1设卷积操作后需要进行激活函数处理的矩阵为a(m,n),relu激活函数为f(x)=max(0,x),向量处理单元vpe的个数为p,一般取n为p、kx、ky的整数倍,最大值池化窗口为kx×ky;

s1.2使用向量vload指令取矩阵a的第一行元素;比如取至向量寄存器vr10中,使用vmovi指令初始化一个向量寄存器vr20为0,即vmovi0,vr20;

s1.3使用向量比较大小指令vfcmpgd,比较向量寄存器vr10和vr20的大小,比较结果的逻辑值放入条件寄存器中,如vr0;vfcmpgdvr10,vr20,vr0,若vr10[i]>vr20[i],1≤i≤p,则vr0[i]=1,否则vr0[i]=0;

s1.4使用条件向量赋值指令vmov,取出步骤1.3中大于0的值放入向量寄存器中,计算指令为:[vr0]vmovvr10,vr20,通过本条件赋值向量指令可以同时计算p个数值的relu激活函数值,将vr10中大于0的数值放入vr20中,小于0的数值设置为0;

s1.5得出relu激活函数处理后的结果vr20;

s1.6根据最大值池化窗口k,重复步骤1.2至1.5k次得出a矩阵k行元素的relu激活函数操作,结果保存在向量寄存器中,不需要存储,直接作为步骤s2中最大值池化的输入值。

s2:计算步骤s1中relu激活函数处理后的矩阵的最大值池化;

s2.1取步骤s1.6中计算得出的k行元素,由于步骤s1.6中的结果直接保存在寄存器中,因此其直接作为本次计算的输入,该过程避免了步骤s1.6中的数据存储时间和步骤s2.2中的数据load时间,因此,计算时间相应的得到了降低。

s2.2将第1行元素与第2行元素作比较,比较结果的逻辑值放入条件寄存器中,如vr1中,vfcmpgdvr20,vr21,vr1,若vr20[i]>vr21[i],1≤i≤p,则vr0[i]=1,否则vr0[i]=0;

s2.3使用条件向量赋值指令vmov,取出步骤s2.2中条件寄存器vr0[i]=1所对应的vpe中的值vr20[i]赋值给对应的vr21[i],则vr21[i]中比vr20[i]大的值,保持不变。

s2.4通过比较k-1次,得出k行元素对应的列最大值。

s2.5配置混洗模式,比较得出步骤s2.4中对应的k列元素的最大值;

s2.6最终同时得出p/k个池化窗口尺寸为kx×ky最大值池化结果;

s3:重复步骤s1和步骤s2直至遍历完矩阵a的所有子块,最终完成整个矩阵a的relu激活函数处理和最大值池化操作。

本发明主要适用于向量处理器,如图2所示,为向量处理器的一般结构示意图。在具体应用实例中,所述步骤s2.5中的一个最大值池化结果c0,0的计算公式为:

其中c0,0为最大值池化结果矩阵中的第一个元素,kx、ky为池化窗口的尺寸,在卷积神经网络中,池化窗口一般为方阵,即kx=ky=k,ai,j为需要进行最大值池化的矩阵a中的元素,其最大值池化流程示意图如图3所示。

在具体应用实例中,在上述步骤中定义池化窗口的大小为sizex、sizey,两个相邻池化窗口的水平位移或竖直位移为stride,最大值池化操作中池化窗口不重叠,即sizex=sizey=stride,如图7所示。

如图5、图6所示,本发明在一个具体应用实例中,详细步骤为:

s100:计算矩阵a的relu激活函数值;

s1.1设卷积操作后需要进行激活函数处理的矩阵为a(16,16),relu激活函数为f(x)=max(0,x),向量处理单元vpe的个数p为16,最大值池化窗口kx=ky=2;

s1.2使用向量vload指令取矩阵a的第1行的16个元素至向量寄存器vr10中,第2行16个元素至vr11中,使用向量赋值指令vmovi指令初始化2个向量寄存器vr20、vr21为0,即vmovi0,vr20,vmovi0,vr21;

s1.3使用向量比较大小指令vfcmpgd,比较向量寄存器vr10和vr20、vr11和vr21的大小,比较结果的逻辑值分别放入条件寄存器vr0、vr1中;vfcmpgdvr10,vr20,vr0、vfcmpgdvr11,vr21,vr1,若vr10[i]>vr20[i],(1≤i≤16),则vr0[i]=1,否则vr0[i]=0,同理vr1[i]=1,否则vr1[i]=0;

s1.4使用条件向量赋值指令vmov,取出步骤1.3中大于等于0的值放入向量寄存器中,计算指令为:[vr0]vmovvr10,vr20、[vr1]vmovvr11,vr21,通过条件赋值指令同时计算矩阵a前两行元素共计32个元素的relu激活函数值;

s1.5矩阵a前两行元素的relu激活函数值放入向量寄存器vr20、vr21中;

s200:计算步骤s100中relu激活函数处理后的矩阵的最大值池化;

s2.1根据最大值池化窗口尺寸kx=ky=2,取出步骤s1.5计算得出的前两行元素,即vr20和vr21,作为最大值池化层的输入;

s2.2将第1行元素vr20与第2行元素vr21做比较,比较结果的逻辑值放入条件寄存器vr2中,计算指令为:vfcmpgdvr20,vr21,vr2,若vr20[i]>vr21[i],1≤i≤p,则vr2[i]=1,否则vr2[i]=0;

s2.3使用条件向量赋值指令vmov,取出步骤s2.3中条件寄存器vr0[i]=1所对应的vpe中的值vr20[i]赋值给对应的vr21[i],则vr21[i]中比vr20[i]大的值,保持不变;

s2.4比较1次,得出2行元素对应的列最大值;

s2.5配置相应的混洗模式,比较得出步骤s2.4中对应的相邻2列元素的最大值;

s2.6最终同时得出(16/2)8个池化窗口尺寸为2×2最大值池化结果;

s300:重复步骤s100和步骤s200,直至遍历完矩阵a的所有子块,最终完成整个矩阵a的relu激活函数处理和最大值池化操作。

以上仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1