本发明属于人工智能技术领域,涉及深度学习技术中的池化计算,特别涉及一种可配置池化算子的方法及电路。
背景技术:
近年来cnn网络(convolutionneuralnetwork,卷积神经网络)在计算机视觉领域中发挥着越来越重要的作用。但是随着深度学习技术的发展和应用场景日益多元化,cnn网络参数量变得越来越庞大,增加了将其移植到硬件上的难度。因此cnn网络加速计算已成为一项重要的研究内容。
主流的cnn网络包含卷积层、批标准化层、激活层、池化层以及全连接层等,其中以乘加计算为主的卷积层和全连接层占据了网络大部分的计算量,因此目前加速计算的重点都在于设计专门的硬件结构来完成乘加计算,从而缩短卷积和全连接这两层的计算时间。cnn加速器主要采用将输入数据分块并存入片上缓存以及循环计算的方法,将数据复用和并行计算这两项技术结合起来共同提高cnn网络的计算效率。在这种设计思路的基础上,可以对加速器的性能进行进一步的优化。
在图像研究领域,池化计算主要是通过在图像特征映射上划分尺寸为n*n的区块,对区块进行一定的操作,最终得到一个输出结果,从而达到缩小图像数据规模的作用。池化计算方式主要分为最大池化和平均池化两种。最大池化是取区块中的最大值作为输出,平均池化是对区块内所有数据取平均值作为输出结果。对图像进行平均池化操作能减少因邻域大小受限而造成的估计值方差增大的误差,同时更多地保留图像的背景信息;而另一方面,最大池化能减少因卷积层参数误差造成的估计均值的偏移,并更多地保留纹理信息。因此在进行卷积神经网络结构设计时,这两种池化方式往往交替使用。而平均池化中较为常见的一种应用是全局平均池化。用全局平均池化取代全连接层,不仅可以直接实现降维,更重要的是极大减少网络的参数量。
cnn网络中的池化层能够不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上能够抑制过拟合。目前cnn网络加速计算的重点主要在于卷积计算,而将池化计算交由处理器来完成。但是随着卷积计算的时间不断被优化,池化计算在计算总时间内所占的比例越来越高。
技术实现要素:
为了克服上述现有技术的缺点,本发明的目的在于提供一种可配置池化算子的方法及电路,通过设计专门用于完成池化计算的硬件结构,不仅可以省去使用处理器计算池化的时间,优化加速器的性能,而且具有良好的通用性,能够支持最大池化和平均池化两种计算类型以及支持不同的区块尺寸等,对于提升cnn加速器的整体性能具有十分重要的作用。
为了实现上述目的,本发明采用的技术方案是:
一种可配置池化算子的方法,设置池化缓存将数据从卷积计算的排列顺序转换为方便进行池化计算的顺序,设计并复用基本的池化计算模块以支持任意区块尺寸下的池化计算。
具体地,可在池化计算之前设置一个片上的池化缓存,先按照卷积计算中的排列次序将数据存入池化缓存,然后再按照池化运算的顺序从池化缓存的相应位置依次取出数据进行计算,其中卷积计算的结果是按行或者列进行排列的,一次池化计算的数据来自跨越不同行列的区块。
对于最大池化计算,根据实际的计算并行度部署相应数量的四输入的最大池化计算模块,每个最大池化计算模块包括三个两输入的比较器,其中最大池化计算模块的四个输入作为两个比较器的四个输入,两个比较器的两个输出作为第三个比较器的输入,完成四个输入中取最大值的操作,根据所述取出数据的顺序将数据送入各最大池化计算模块,完成多个区块的并行池化计算;
所述最大池化计算中,比较器内部对两个有符号数进行比较的具体逻辑为先判断两个数符号位是否一致,若一致则直接比较后面的数字位的大小;若符号位不一致则取符号位为0的数作为输出结果;
对于平均池化计算,根据实际的计算并行度部署相应数量的四输入的平均池化计算模块,每个平均池化计算模块包括三个两输入的加法器,其中平均池化计算模块的四个输入作为两个加法器的四个输入,两个加法器的两个输出作为第三个加法器的输入,完成四个输入的相加操作,第三个加法器的输出送入一个移位器,用右移两位来实现取平均数的操作。
进一步地,所述平均池化计算中,通过复用所述平均池化计算模块若干次,并在第三个加法器的输出与移位器的输入之间设置累加器,从而实现全局平均池化,通过改变复用平均池化计算模块的次数,实现任意尺寸下的全局平均池化计算。
进一步地,将若干块池化后的数据拼接成一块与池化前尺寸相同的数据再存入输出缓存,以保证网络每一层的输入分块数据尺寸均相同。
进一步地,可以根据实际计算的需求,从池化前一计算模块输出的数据既存入输出缓存,又进入池化缓存进行池化计算,从而同时得到进行池化计算和非池化计算两种情况下的结果。
进一步地,池化单元的控制器会控制将卷积计算结果按顺序存入池化缓存,然后输出一次池化计算区块中左上角位置的数据在池化缓存中的地址;在池化计算完成后进行数据拼接给出结果数据在输出缓存中的地址。
本发明还提供了一种可配置池化算子的电路,包括:
片上池化缓存,按照卷积计算中的排列次序存入数据,再按照池化运算的顺序取出相应位置的数据;
池化计算模块,接收池化缓存输出的数据进行计算。
所述池化计算模块包括最大池化计算模块和平均池化计算模块,其中:
所述最大池化计算模块与池化区块数量相同,每个最大池化计算模块有四个输入,每个最大池化计算模块包括三个两输入的比较器,其中最大池化计算模块的四个输入作为两个比较器的四个输入,两个比较器的两个输出作为第三个比较器的输入,完成四个输入中取最大值的操作,根据所述取出数据的顺序将数据送入各最大池化计算模块,完成多个区块的并行池化计算;
所述平均池化计算模块与池化区块数量相同,每个平均池化计算模块有四个输入,每个平均池化计算模块包括三个两输入的加法器,其中平均池化计算模块的四个输入作为两个加法器的四个输入,两个加法器的两个输出作为第三个加法器的输入,完成四个输入的相加操作,第三个加法器的输出送入一个移位器,用右移两位来实现取平均数的操作。
进一步地,所述平均池化计算模块中,通过复用所述平均池化计算模块若干次,并在第三个加法器的输出与移位器的输入之间设置累加器,从而实现全局平均池化,通过改变复用平均池化计算模块的次数,实现任意尺寸下的全局平均池化计算。
进一步地,本发明可配置池化算子的电路还包括:
控制器,控制将卷积计算结果按顺序存入池化缓存,然后输出一次池化计算区块中左上角位置的数据在池化缓存中的地址,并在池化计算完成后又进行数据拼接,给出结果数据在输出缓存中的地址;还给出是否进行池化计算以及池化计算类型的信号。
与现有技术相比,本发明的有益效果是:
在cnn加速器中使用以上设计的池化计算模块,可以节省使用处理器进行池化计算的时间。在没有池化模块的情况下,要花费若干个时钟周期将完成卷积和激活操作的数据存入输出缓存中;而增加池化模块之后,将数据先存入池化缓存中,花费的时间与存入输出缓存是相同的。在加速器的流水线设计下,池化计算与原来直接存入输出缓存相比,几乎没有额外的时间开销。此外以池化区块尺寸为2*2为例,池化计算后的结果与不进行池化计算相比,虽在拼接策略下输出缓存向内存每次传送的数据量是相等的,但传送次数却变为了原来的四分之一,因此减少了数据传输时间。这在一定程度上提升了cnn加速器的整体性能。
另外从通用的角度考虑,对于最大池化来说,只要复用四输入取最大值的计算模块若干次,就可以实现任意区块尺寸下的最大池化计算;对于平均池化来说,也只需复用四输入的平均值计算模块并添加一个累加器,便可实现任意尺寸下的全局平均池化。因此该池化计算模块具有较好的灵活性和通用性,可以适用于目前各种主流的池化层计算。
附图说明
图1是卷积和池化的计算顺序示意图。
图2是卷积计算结果在缓存中的位置以及进行池化计算前取出数据的方式示意图。
图3是最大池化计算模块的结构示意图。
图4是平均池化计算模块的结构示意图。
图5是平均池化计算模块复用方式示意图。
图6是池化拼接策略示意图。
图7是本发明具体实施例中池化模块的完整结构示意图。
具体实施方式
下面结合附图和实施例详细说明本发明的实施方式。
如图1所示,本发明一种可配置池化算子的方法及电路,对其方案以及原理如下:
在cnn网络加速计算中使用的一项基本策略是对数据进行分块,从内存传送到输入缓存的输入数据以及从输出缓存传回内存的计算结果都是分块形式的。池化计算位于卷积和激活计算之后,但是池化计算输入的分块数据在卷积计算次序中并不是连续排列的。图1分别展示了卷积和池化的计算顺序(以分块尺寸10*10和池化尺寸2*2为例)。卷积计算的结果是按行排列的,而一次池化计算的数据则来自跨越不同行的区块,因此池化的硬件设计首先要解决这一问题。
对于以上问题的解决方案是在池化计算之前设置一个片上缓存作为池化缓存,先按照卷积计算中的排列次序将数据存入池化缓存,然后再按照池化运算的顺序从池化缓存的相应位置依次取出数据进行计算。图2展示了卷积计算结果在缓存中的存储位置以及进行池化计算前取出数据的方式。池化单元的控制器会按照图中所示顺序输出一次池化计算区块中左上角位置的数据地址,即0,2,4,6,8,20……80,82,84,86,88,然后片上缓存读写模块接收到该地址后会一次性输出四个数据的地址,如0,1(0 1),10(0 10),11(0 11),保证准确有序地输出每次池化计算所需数据。
在池化计算中,分为平均池化和最大池化两种形式。
目前最为常见的最大池化方式是每隔2个元素从图像划分出2*2的区块,然后对每个区块中的4个数取最大值。为此本发明采用两输入的比较器,再设计四输入的最大池化计算模块,该模块例化三个两输入的比较器,可完成4个数中取最大值的操作。然后便可根据实际的需求部署若干个这样的计算模块,并按照前述取数据的顺序将数据送入池化计算模块中,便可完成多个区块的并行池化计算。具体的硬件结构如图3所示。
在比较器内部对两个有符号数进行比较的具体逻辑为先判断两个数符号位是否一致,若一致则直接比较后面的数字位的大小;若符号位不一致则取符号位为0的数作为输出结果。
平均池化的计算方式为每隔n个元素从图像划分出n*n的区块,然后对每个区块中的n2个数取平均值。将n=2时的情况作为基本的平均池化模块。因此先设计两输入的加法器,再设计平均池化计算模块,该模块例化三个加法器,最后将四个数相加的结果送入一个移位器,用右移两位来实现取平均数的操作。图4所示为平均池化计算模块的硬件结构。
在cnn网络中经常使用全局平均池化的方式。这种方式的池化区块规模一般较大,在输入特征映射的尺寸为224*224*3的情况下,全局平均池化规模通常为7*7。在这种情况下,可通过复用上述平均池化计算模块若干次以及添加累加器来实现。图5展示了复用的方式。如果输入特征映射的尺寸变化,全局平均池化的规模也会随之发生改变。只需改变复用基本计算模块的次数即可实现任意尺寸下的全局平均池化计算。
此外,池化计算结果的规模相较计算前会缩小。以区块尺寸为2*2,步长为2为例,池化完成后数据量将变为原来的四分之一。如果就这样直接将结果存入输出缓存后,网络下一层计算时输入分块数据的尺寸也会变为上一层输入的四分之一,而cnn网络中往往具有多个池化计算层,这样显然不利于后续计算。因此在此提出一种将四块池化后的数据拼接成一块与池化前尺寸相同的数据再存入输出缓存的整合策略,利用这种策略可以保证网络每一层的输入分块数据尺寸均相同。图6展示了具体的拼接方法。
图6以分块数据的尺寸为10*10为例,方框内数字表示每个池化前的分块数据与池化计算完成后存入输出缓存内相应地址的对应关系。从图中可以看出第一块分块数据完成池化计算后的25个数分别对应了输出缓存中0~4,10~14,20~24,30~34,40~44这些地址,第二块对应了5~9,15~19,25~29,35~39,45~49这些地址……这样四块规模为25的池化结果重新拼接为一块规模为100的分块数据以供网络下一层继续进行计算,避免了池化操作造成网络下一层输入尺寸发生改变的问题。相应地址的输出是由池化单元的控制器来完成的。
在cnn加速器设计中,池化模块前有一个选择器,用来控制前一计算模块的输出数据是否要进行池化计算。此外,本设计还支持数据同时进行池化和非池化计算。在这种情况下,从池化前一计算模块输出的数据既存入输出片上缓存,又进入池化单元进行计算。原本两块相同的输出片上缓存工作在ping-pong模式下,现在一块用来暂存没有经过池化的数据,另一块则暂存经过池化计算的数据,即它们不再工作在ping-pong模式。
本发明前述可配置池化算子的方法中,所有内容都离不开控制器对数据读写和计算模块的控制。控制器首先会将卷积计算结果按顺序存入池化缓存,然后输出一次池化计算区块中左上角位置的数据在池化缓存中的地址;在池化计算完成后又按照前述的数据拼接策略给出结果数据在输出缓存中的地址。此外控制器还会给出是否进行池化计算以及池化计算类型的信号,因此它是保证池化计算能够有序进行的关键。
图7为整个池化模块的完整结构图。在本发明的一个具体实施例中,以fpga开发板作为cnn加速器的实现平台,运行完整的vgg16和ssd300这两个网络,并对用软件计算池化和用硬件实现这两种情况下加速器的性能进行对比。这两个网络都具有五层池化层,区块尺寸基本为2*2,步长也基本为2。因此完全可以用以上所述的池化模块来完成这些池化层的计算。
在本实施例中将vgg16网络和ssd300网络每层的输入分块数据尺寸分别确定为9*9*16和12*12*16。若用fpga开发板上的arm处理器来完成两个网络中的池化计算,分别需要23ms和35ms,而利用池化计算模块来进行这部分计算的话则完全可以省去这些时间,另外还会减少一定数量的数据传输时间。加速器完成上述网络的一张图片的推理过程所需要的理论计算时间大约为200ms和400ms左右,那么使用池化计算模块能够分别将一张图片的推理时间缩短11.5%和8.75%。并且随着卷积计算单元的算力不断提高以及加速器技术不断优化,池化计算模块所带来的优化效果会越来越显著,因此用硬件实现池化计算在提升加速器性能方面起到了十分明显的作用。
1.一种可配置池化算子的方法,其特征在于,设置池化缓存将数据从卷积计算的排列顺序转换为方便进行池化计算的顺序,设计并复用基本的池化计算模块以支持任意区块尺寸下的池化计算。
2.根据权利要求1所述可配置池化算子的方法,其特征在于,对于最大池化计算,根据实际的计算并行度部署相应数量的四输入的最大池化计算模块,每个最大池化计算模块包括三个两输入的比较器,其中最大池化计算模块的四个输入作为两个比较器的四个输入,两个比较器的两个输出作为第三个比较器的输入,完成四个输入中取最大值的操作,根据所述取出数据的顺序将数据送入各最大池化计算模块,完成多个区块的并行池化计算;
对于平均池化计算,根据实际的计算并行度部署相应数量的四输入的平均池化计算模块,每个平均池化计算模块包括三个两输入的加法器,其中平均池化计算模块的四个输入作为两个加法器的四个输入,两个加法器的两个输出作为第三个加法器的输入,完成四个输入的相加操作,第三个加法器的输出送入一个移位器,用右移两位来实现取平均数的操作。
3.根据权利要求2所述可配置池化算子的方法,其特征在于,所述最大池化计算中,比较器内部对两个有符号数进行比较的具体逻辑为先判断两个数符号位是否一致,若一致则直接比较后面的数字位的大小;若符号位不一致则取符号位为0的数作为输出结果;
所述平均池化计算中,通过复用所述平均池化计算模块若干次,并在第三个加法器的输出与移位器的输入之间设置累加器,从而实现全局平均池化,通过改变复用平均池化计算模块的次数,实现任意尺寸下的全局平均池化计算。
4.根据权利要求1或2所述可配置池化算子的方法,其特征在于,将若干块池化后的数据拼接成一块与池化前尺寸相同的数据再存入输出缓存,以保证网络每一层的输入分块数据尺寸均相同。
5.根据权利要求1所述可配置池化算子的方法,其特征在于,支持数据同时进行池化和非池化计算,从池化前一计算模块输出的数据既存入输出缓存,又进入池化缓存进行池化计算。
6.根据权利要求1所述可配置池化算子的方法,其特征在于,池化单元的控制器首先将卷积计算结果按顺序存入池化缓存,然后输出一次池化计算区块中左上角位置的数据在池化缓存中的地址;在池化计算完成后进行数据拼接给出结果数据在输出缓存中的地址。
7.一种可配置池化算子的电路,包括:
片上池化缓存,按照卷积计算中的排列次序存入数据,再按照池化运算的顺序取出相应位置的数据;
池化计算模块,接收池化缓存输出的数据进行计算。
8.根据权利要求7所述可配置池化算子的电路,其特征在于,所述池化计算模块包括最大池化计算模块和平均池化计算模块,其中:
所述最大池化计算模块例化的数量与计算并行度一致,每个最大池化计算模块有四个输入,每个最大池化计算模块包括三个两输入的比较器,其中最大池化计算模块的四个输入作为两个比较器的四个输入,两个比较器的两个输出作为第三个比较器的输入,完成四个输入中取最大值的操作,根据所述取出数据的顺序将数据送入各最大池化计算模块,完成多个区块的并行池化计算;
所述平均池化计算模块例化的数量与计算并行度一致,每个平均池化计算模块有四个输入,每个平均池化计算模块包括三个两输入的加法器,其中平均池化计算模块的四个输入作为两个加法器的四个输入,两个加法器的两个输出作为第三个加法器的输入,完成四个输入的相加操作,第三个加法器的输出送入一个移位器,用右移两位来实现取平均数的操作。
9.根据权利要求7所述可配置池化算子的电路,其特征在于,所述平均池化计算模块中,通过复用所述平均池化计算模块若干次,并在第三个加法器的输出与移位器的输入之间设置累加器,从而实现全局平均池化,通过改变复用平均池化计算模块的次数,实现任意尺寸下的全局平均池化计算。
10.根据权利要求7所述可配置池化算子的电路,其特征在于,还包括:
控制器,控制将卷积计算结果按顺序存入池化缓存,然后输出一次池化计算区块中左上角位置的数据在池化缓存中的地址,并在池化计算完成后又进行数据拼接,给出结果数据在输出缓存中的地址;还给出是否进行池化计算以及池化计算类型的信号。
技术总结