掌桥专利:专业的专利平台
掌桥专利
首页

基于并行复用的卷积神经网络的硬件加速器及并行复用方法

文献发布时间:2023-06-19 16:04:54



技术领域

本发明属于人工智能硬件设计领域,尤其涉及一种卷积神经网络并行复用网络计算加速器的实现方法。

背景技术

卷积神经网络(Convolutional Neural Network,CNN)是近些年来深度学习(DeepLearning,DL)领域的热门方向。然而,随着CNN模型的数据量不断增大,计算投入、精度要求的不断提高等趋势,使得卷积神经网络的加速处理成为挑战。

一般的,为了加速CNN算法,经常利用其如下的两大特点:(1)稀疏连接:计算过程的内部神经元的连接改变成非全连接的形式,从CNN可视化的角度来讲,就是输出特征图某个响应的节点对应的不再是整个输入图像,其对应的输入图像的局部区域就是局部感受野。神经网络中结构复杂,参数众多,可以着重降低神经网络架构的参数规模;(2)权值共享:虽然可以利用上面CNN的稀疏连接特点,使计算量降低几个数量级。但是,权值参数的数量依旧巨大,那么也可以利用权值共享这一特点,以数据复用的方式减少数据使用次数。通过这一特性,可以进一步通过展开循环的方式寻找可以复用的地方。根据以上的两大特征,我们可知,CNN的算法加速离不开减少互联、增加复用。同时,CNN算法的模型为无同层互联的分层网络,所以对于同层的单元的相关计算可以并发完成。

目前的CNN运算的并行复用加速结构,主要在四个层次上实现:

(1)层与层之间并行复用:由于相邻层之间的数据存在依赖关系,不能够直接全并行化处理,但是可以采用流水线结构。相邻层在深度神经网络的计算架构中,它们各自的卷积和全连接运算的参数量都比较大,无法全部存储到加速器中,因此流水线架构难以形成,但是池化层、激活层等可以使用层与层间的流水结构;

(2)输出特征图之间的并行复用:每一输出特征图,各自对应一组的权重参数,但他们之间的输入特征图是共用的。由于输出特征图之间相互独立,致使它们在理论上是可以达到完全并行的。这种方式在实现过程中相当于是固定输入特征图,同时遍历多组权重;

(3)输入特征图之间并行复用:对于一张特定的输出特征图而言,它对应的输入特征图之间也是相互独立的,每一输入特征图对应各自的权重参数,因此,这些输入特征图之间的计算可以完全并行。这种并行方式的计算过程是同时对多张输入特征图进行模板卷积,再将对应点的值进行累加;

(4)输出像素之间并行复用:这种并行度是也是对应于一张特定的输出特征图而言,为了能够在一个周期实现多个像素的计算,需要拓展顶层接口的位宽,使其能在一个时钟周期内同时加载多个像素。这些输出像素之间对应的权重一致,但是对应的输入特征图之间存在藕合,其耦合程度与权重模板的大小相关。输出特征图之间的并行、输入特征图之间并行、输出像素之间并行这三者均属于层内的并行性。

现阶段对于卷积运算,主要是由乘加器构成,对于单个乘加器而言,计算十分简单,而对多层循环嵌套的乘加器来说,计算数据量将十分巨大。虽然传统卷积神经网络可以在硬件中大规模的并行实现,但受到带宽、计算资源、存储等资源的限制,尤其在面对大型卷积计算时不够灵活。

发明内容

本发明是为了解决上述现有技术存在的不足之处,提出一种基于并行复用的卷积神经网络的硬件加速器及并行复用方法,以期能以拆分重组、循环展开为策略,通过并行、复用的方法简化神经网络中大规模卷积计算,从而实现高运算并行度、高度数据复用、低硬件复杂度的卷积神经网络计算,并改善硬件实现大规模卷积计算时速度慢以及资源浪费大的问题。

本发明为达到上述目的所采用的技术方案是:

本发明一种基于并行复用的卷积神经网络的硬件加速器的特点是:所述卷积神经网络包括K层卷积层,K+1层激活层,K层池化层,2层全连接层;并基于MNIST手写数字集对所述卷积神经网络进行训练,得到练后的权值参数;

所述硬件加速器包括:参数存储模块、2个REG-FIFO模块、计数控制模块、3个输入复用的卷积运算模块、激活模块、池化层模块;

所述参数存储模块中存储有所述MNIST手写数字集以及训练后的权值参数;

所述REG-FIFO模块是依次由m-1个的子结构和m个REG寄存器连接而成,每个子结构是依次由m个REG寄存器和一个深度为n的FIFO组成;

定义所述卷积神经网络的当前卷积层为第k层,并初始化k=1;

第一REG-FIFO模块作为卷积层的输入模块;

若k=1,则第一REG-FIFO模块的输入特征图为所述MNIST手写数字集中的一张手写数字图片,若k>1,则第一REG-FIFO模块的输入特征图是中间特征图;

所述第一REG-FIFO模块的输入端在接收到所述输入特征图后,由所述计数控制模块配合时钟周期t控制,从所述输入特征图中的(0,0)位置开始,依次逐行读取维度为(m+n)×(m+n)的图像矩阵;

当时钟周期t<m×m+(m-1)×n时,表示所述第一REG-FIFO模块中未填充到与m×m的卷积核相匹配的输入矩阵,并设置REG寄存器为不可读状态;

当时钟周期t≥m×m+(m-1)×n时,表示所述第一REG-FIFO模块中已填充到与m×m的卷积核相匹配的输入矩阵,并记录当前时刻T=m×m+(m-1)×n;

定义所述计数控制模块的计数器为i,并初始化i=0;从T-1时刻起,每经过n+1个时钟周期,则计数器i自增1;

当i为奇数时,表示m×m个REG寄存器输出的m×m的矩阵为无效矩阵,并设置REG寄存器为不可读状态;

当i为偶数时,表示m×m个REG寄存器输出的m×m的矩阵为有效矩阵,并设置REG寄存器为可读状态,在时钟周期t的控制下,将m×m个REG寄存器中的数值从左到右依次传输到第一输入复用的卷积运算模块;

第一输入复用的卷积运算模块用于对卷积神经网络进行运算,令第k层卷积层中包含有由m×m个乘法单元串联m×m个加法单元构建的乘加树、以及m×m个D触发器组成,其中所述m×m个D触发器分别与所述m×m个加法单元构成前向反馈通道;

所述乘加树的输入端分别连接至所述参数存储模块的输出端和所述第一REG-FIFO模块的REG寄存器的输出端;

将m×m个乘法单元依次编号,并将第一个乘法单元至第m×m个乘法单元的公共输入端分别连接第m×m个REG寄存器的输出端,其中,任意第M个乘法单元的另一输入端接至所述参数存储单元的第M行存储区;设置乘法单元的公共输入端的传输频率为1/T,与参数存储单元相连的乘法单元的输入端的传输频率为m×m/T;M=1,2,…,m×m;

所述D触发器对乘加树的结果进行累加后,按照乘法单元的顺序,依次输出m×m的矩阵,并作为第k层卷积层的输出特征图;

使用所述激活模块对所述第k层卷积层的输出特征图进行激活处理;所述激活模块采用多路选择器实现K+1层激活层;所述多路选择器的选择控制端输入m×m的有效数据的符号位,当符号位为“1”时,所述多路选择器的输出为“0”;当符号位为“0”时,所述多路选择器的输出为所输入的有效数据,并作为第k层激活层的输出特征图;

所述激活模块的输出端连接所述第二REG-FIFO模块的输入端;所述第二REG-FIFO模块的输出端作为池化模块的输入端;所述池化模块用于实现K层池化层;

所述第二REG-FIFO模块读取第k层激活层的输出特征图中一个通道长度为m×m的有效数据并传输给所述池化模块的输入端;

第k层池化层对第k层激活层的输出特征图进行最大值池化处理,若k<K时,得到的池化结果作为第k+1层卷积层的输入特征图,若k=K时,第K层池化层的输出结果作为全连接层的输入;

第二和第三输入复用的卷积运算模块用于实现2层全连接层;其中,第一层全连接层对第k+1层卷积层的输入特征图和参数存储模块中相应权值参数进行并行化的全连接计算:

将所述池化模块输出的池化数据的前一半输入第二输入复用的卷积运算模块的公共输入端,再将另一半池化数据输入第三输入复用的卷积运算模块的公共输入端,第二和第三输入复用的卷积运算模块的非公共输入端均接在所述参数存储模块的输出端;

第二层全连接层对第一层全连接层的输出数据和参数存储模块中相应权值参数进行并行化的全连接计算:

将所述第一层全连接层的输出数据的前一半输入第二输入复用的卷积运算模块的公共输入端,再将另一半输出数据输入第三输入复用的卷积运算模块的公共输入端,第二和第三输入复用的卷积运算模块的非公共输入端均接在所述参数存储模块的输出端;

第二层全连接层的输出数据经过第K+1层激活层处理后,得到的输出结果作为所述硬件加速器对所述MNIST手写数字集中数字的识别结果。

本发明所述的一种基于并行复用的卷积神经网络的硬件加速器的特点也在于:第一输入复用的卷积运算模块对卷积神经网络的第k层卷积层进行运算时,先利用式(1)计算硬件资源利用率,并判断硬件资源利用率是否小于“1”;若小于,则表示硬件资源充足,并增加输入复用的卷积运算模块的个数为a,从而利用a个输入复用的卷积运算模块对各自输入的数据进行并行卷积处理,得到第k层卷积层的输出特征图,其中,a与资源利用率成反比;否则,表示硬件资源不足,并利用所述第一输入复用的卷积运算模块得到第k层卷积层的输出特征图;

硬件资源利用率=FIFO的深度×FIFO的宽度/FPGA内嵌存储器大小 (1)。

本发明一种基于卷积神经网络硬件加速器的并行复用方法的特点是按如下的步骤进行:

步骤1、构建卷积神经网络,包括K层卷积层,K+1层激活层,K层池化层,2层全连接层;设置每层的卷积层均包含有6层循环,其中,1、2层循环的控制因子是卷积核尺寸,用于卷积运算的乘加操作;3、4层循环的控制因子是输出特征图的行、列数,用于将内四层的卷积运算结果按要求格式输出;5、6层循环的控制因子是输出、输入通道数,用于激活操作;设置每层全连接层均包含2层循环,其中,内层循环为所述卷积层1、2层的乘加循环,外层循环为所述卷积层5、6层的激活循环;

步骤2、采用MNIST手写数字集对所述卷积神经网络进行训练,得到权值参数;

步骤3、构建加速器硬件包括:参数存储模块、2个REG-FIFO模块、计数控制模块、3个输入复用的卷积运算模块、激活模块、池化层模块;同时将MNIST手写数字集的图像参数以及训练后的权值参数存入所述参数存储模块中;

步骤4、定义所述卷积神经网络的当前卷积层为第k层,并初始化k=1;

步骤5、在卷积神经网络的第k层计算下,若k=1,则第一REG-FIFO模块的输入特征图为所述MNIST手写数字集中的一张手写数字图片,若k>1,则第一REG-FIFO模块的输入特征图是中间特征图;

步骤6、所述第一REG-FIFO模块的输入端在接收到所述输入特征图后,由所述计数控制模块配合时钟周期t控制,从所述输入特征图中的(0,0)位置开始,依次逐行读取维度为(m+n)×(m+n)的图像矩阵;

当时钟周期t<m×m+(m-1)×n时,表示所述第一REG-FIFO模块中未填充到与m×m的卷积核相匹配的输入矩阵,并设置REG寄存器为不可读状态;

当时钟周期t≥m×m+(m-1)×n时,表示所述第一REG-FIFO模块中已填充到与m×m的卷积核相匹配的输入矩阵,并记录当前时刻T=m×m+(m-1)×n;

步骤7、定义所述计数控制模块的计数器为i,并初始化i=0;从T-1时刻起,每经过n+1个时钟周期,则计数器i自增1;

步骤8、当i为奇数时,设置REG寄存器为不可读状态;

当i为偶数时,设置REG寄存器为可读状态,在时钟周期t的控制下,将m×m个REG中的数值从左到右依次传输到第一输入复用的卷积运算模块;

步骤9、令第k层卷积层中包含有由m×m个乘法单元串联m×m个加法单元构建的乘加树、以及m×m个D触发器组成,其中所述m×m个D触发器分别与所述m×m个加法单元构成前向反馈通道;

所述乘加树的输入端分别连接至所述参数存储模块的输出端和所述第一REG-FIFO模块的REG寄存器的输出端;

利用第一输入复用的卷积运算模块对第k层卷积层的输出通道循环展开:

将第一个乘法单元至第m×m个乘法单元的公共输入端分别连接第m×m个REG寄存器的输出端,其中,任意第M个乘法单元的另一输入端接至所述参数存储单元的第M行存储区;设置乘法单元的公共输入端的传输频率为1/T,与参数存储单元相连的乘法单元的输入端的传输频率为m×m/T;M=1,2,…,m×m;

步骤10、利用式(1)计算硬件资源利用率,并判断硬件资源利用率是否小于“1”,若小于,则表示硬件资源充足,并执行转步骤11,否则,表示硬件资源不足;并执行转步骤12;

硬件资源利用率=FIFO的深度×FIFO的宽度/内嵌存储器大小 (1)

步骤11、对第k层输入通道进行循环展开:

增加输入复用的卷积运算模块的个数为a,并利用a个输入复用的卷积运算模块对其输入的a组数据进行并行处理,并得到第k层卷积层的输出特征图,其中,a与资源利用率成反比;

步骤12、所述D触发器对乘加树的结果进行累加后,按照乘法单元的顺序,依次输出m×m的矩阵,并作为第k层卷积层的输出特征图;

步骤13、使用所述激活模块对所述第k层卷积层的输出特征图进行激活处理;所述激活模块采用多路选择器实现K+1层激活层;所述多路选择器的选择控制端输入m×m的有效数据的符号位,当符号位为“1”时,所述多路选择器的输出为“0”;当符号位为“0”时,所述多路选择器的输出为所输入的有效数据,并作为第k层激活层的输出特征图;

步骤14、所述激活模块的输出端连接所述第二REG-FIFO模块的输入端;所述第二REG-FIFO模块的输出端作为池化模块的输入端;所述池化模块用于实现K层池化层;

从首地址开始池化操作;

步骤15、第二REG-FIFO读取第k层激活层的输出特征图中一个通道长度为m×m的有效数据并传输给所述池化模块的输入端并进行最大值池化处理;

步骤16、若k<K时,则表示得到的池化结果即为第k+1层卷积层的输入特征图,并将k+1赋值给k后转至步骤17,若k=K时,则表述第K层池化层的输出结果即为全连接层的输入,并转至步骤18;

步骤17、将特征图数据读地址自增1,再跳回步骤15;

步骤18、所述全连接层对第k+1层卷积层的输入特征图和参数存储模块中相应权值参数进行并行化的全连接计算:

将所述池化模块输出的池化数据的前一半输入第二输入复用的卷积运算模块的公共输入端,再将另一半池化数据输入第三输入复用的卷积运算模块的公共输入端,第二和第三输入复用的卷积运算模块的非公共输入端均接在所述参数存储模块的输出端;

第二层全连接层对第一层全连接层的输出数据和参数存储模块中相应权值参数进行并行化的全连接计算:

将所述第一层全连接层的输出数据的前一半输入第二输入复用的卷积运算模块的公共输入端,再将另一半输出数据输入第三输入复用的卷积运算模块的公共输入端,第二和第三输入复用的卷积运算模块的非公共输入端均接在所述参数存储模块的输出端;

步骤19、在参数存储模块中,将权值数据的地址自增1;

步骤20、查看编译器运行状态并等待,判断所述全连接层的当前输入与当前权值的乘加运算是否完成,如果已经完成,则转至步骤21;如果未完成,则跳回步骤18;

步骤21、查看编译器运行状态,判断是否全连接完所有的输入,如果处理完成,则跳转至步骤23,全连接操作结束;如果未完成,则跳转至步骤22;

步骤22、将输入数据的地址自增1;然后,跳回步骤18;

步骤23、全连接层的激活:将特征图数据读地址自增1再使用第K+1层激活层激活;

步骤24、判断所有神经元运算是否完成激活,如果未完成,则跳回步骤23,如果完成,则得到的输出结果作为所述加速器对所述MNIST手写数字集中数字的识别结果。

与现有技术相比,本发明的有益技术效果体现在:

1、本发明提出了对已有CNN算法的卷积层、全连接层拆分重组,安排复用的方法进行算法拆分后,改变了算法中循环嵌套顺序不会影响计算结果,极大地提高了循环展开优化的灵活性。而且将原有卷积层和全连接层高度相似的卷积运算,使用同一电路模块实现,使得网络复用度更提高,一定程度上加快了网络的运算速度。

2、本发明提出了一种REG-FIFO的结构作为数据流控制器,可以在(m+n)×(m+n)的图像矩阵上提取出与卷积核大小相符合的矩阵,在保证性能的基础上,大程度降低了硬件结构的复杂度,以及硬件面积,高效快速的传递输入以及中间结果。而且该结构通过类似流水线的方式,将特征图中的像素数据并行提取,而且能将循环改变特征数据内容。在该循环展开之后,特征图像素数据均可在REG(寄存器)中得到复用。

3、本发明将通过拆分重组、循环展开的主要策略,实现了卷积神经网络的并行复用,简化了神经网络中大规模卷积计算。通过对卷积核、输出通道的基本循环展开以及对全连接层并行数据处理的方法,不仅优化了循环控制结构,缩小了卷积层循环语句的电路所占的面积,而且提高了全连接层的输入数据的复用率和运算的并行度,有效缩短了卷积核运算的时间。

4、本发明使用多路选择器代替传统硬件实现RELU函数,减少了电路面积,提高了运算速度。将多路选择器的选择控制端输入m×m的有效数据的符号位,当符号位为“1”时,多路选择器的输出为“0”;当符号位为“0”时,多路选择器的输出为所输入的有效数据,从而降低了运算以及硬件的复杂度。

附图说明

图1是本发明采用的手写数字识别卷积神经网络流程图;

图2是本发明的模块结构图;

图3是本发明采用的REG-FIFO模块的结构图;

图4是本发明采用的REG-FIFO模块的工作过程示意图;

图5是本发明采用的输入复用的卷积运算模块基本结构图;

图6是本发明采用的激活模块的MUX实现结构图;

图7是本发明采用的全连接过程示意图;

图8是本发明的卷积层与全连接层加速方式实现流程图;

图9是本发明的激活池化流程图。

具体实施方式

在本实施例中,卷积神经网络包括K层卷积层,K+1层激活层,K层池化层,2层全连接层;并基于MNIST手写数字集对卷积神经网络进行训练,得到权值参数;

本实施例中采用的卷积神经网络为手写数字识别网络,如图1所示,其结构包括:2层卷积层、3层激活层、2层池化层、2层全连接层,采用3×3的卷积核;除了紧接在卷积层之后的激活层对特征图尺寸无影响,其他的六层网络安排如下:第一层为卷积层,输入特征尺寸为28×28×1,权值矩阵大小为3×3×1×4,偏置向量长度为4,输出特征尺寸为28×28×4;第二层为池化层,输入特征图尺寸为28×28×4,输出特征图尺寸为14×14×4;第三层为卷积层,输入特征图尺寸为14×14×4,权值矩阵大小为3×3×4×16,偏置向量长度为16,输出特征图尺寸为14×14×16;第四层为池化层,输入特征图尺寸为14×14×16,输出特征图尺寸为7×7×16;第五层为全连接层,全连接长度为784,权值矩阵大小为784×128,偏置向量长度为128,全连接输出长度为128;第六层为全连接层,全连接长度为128,权值矩阵大小为128×10,偏置向量长度为10,全连接输出长度为10;

一种基于并行复用的卷积神经网络的硬件加速器的结构包括:参数存储模块、2个REG-FIFO模块、计数控制模块、3个输入复用的卷积运算模块、激活模块、池化层模块,结构如图2所示;

卷积神经网络对维度为(m+n)×(m+n)的输入图像进行训练,本实施例主要利用MNIST(Mixed National Institute of Standards and Technology database)手写数字集完成,MNIST手写数字图像的大小是28×28的,即输入层节点数量为784,训练完成之后得到每一层的神经网络训练参数;

参数存储模块中存储有MNIST手写数字集以及训练后的权值参数;特征图的数据存放顺序为:参数存储模块的初始地址处存放第一个特征图的第一行数据,第二个地址存放第一个特征图的第二行数据,依次存放玩第一个特征图的所有数据之后,继续存放第二个特征图的第一行数据,按照以上规则存放完本层的所有特征图的数据为止;

REG-FIFO模块是依次由m-1个的子结构和m个REG寄存器连接而成,每个子结构是依次由m个REG寄存器和一个深度为n的FIFO组成,例如m=3,n=2时的示意结构如图3所所示;本实施例中,REG-FIFO模块是依次由2个的子结构和3个REG寄存器连接而成,每个子结构是依次由3个REG寄存器和一个深度为25的FIFO级联单元组成;

定义卷积神经网络的当前卷积层为第k层,并初始化k=1;

第一REG-FIFO模块作为卷积层的输入模块;

若k=1,则第一REG-FIFO模块的输入特征图为MNIST手写数字集中的一张手写数字图片,若k>1,则第一REG-FIFO模块的输入特征图是中间特征图;

第一REG-FIFO模块的输入端在接收到输入特征图后,由计数控制模块配合时钟周期t控制,从输入特征图中的(0,0)位置开始,依次逐行读取维度为(m+n)×(m+n)的图像矩阵;本实施例中,读取的图像矩阵维度为28×28;

当时钟周期t<m×m+(m-1)×n时,表示第一REG-FIFO模块中未填充到与m×m的卷积核相匹配的输入矩阵,并设置REG寄存器为不可读状态;

当时钟周期t≥m×m+(m-1)×n时,表示第一REG-FIFO模块中已填充到与m×m的卷积核相匹配的输入矩阵,并记录当前时刻T=m×m+(m-1)×n;本实施例所用的卷积核尺寸是3×3,且T=m×m+(m-1)×n=59;

定义计数控制模块的计数器为i,并初始化i=0;从T-1时刻起,每经过n+1个时钟周期,则计数器i自增1;本实施例中,从第58个时钟周期起,每经过26个时钟周期,计数器i自增1;

当i为奇数时,表示m×m个REG寄存器输出的m×m的矩阵为无效矩阵,并设置REG寄存器为不可读状态;

当i为偶数时,表示m×m个REG寄存器输出的m×m的矩阵为有效矩阵,并设置REG寄存器为可读状态,在时钟周期t的控制下,将m×m个REG寄存器中的数值从左到右依次传输到第一输入复用的卷积运算模块,例如m=3,n=2时的具体工作流程示意如图4所示;

第一输入复用的卷积运算模块用于对卷积神经网络进行运算,令第k层卷积层中包含有由m×m个乘法单元串联m×m个加法单元构建的乘加树、以及m×m个D触发器组成,其中m×m个D触发器分别与m×m个加法单元构成前向反馈通道,如图5所示;

乘加树的输入端分别连接至参数存储模块的输出端和第一REG-FIFO模块的REG寄存器的输出端;

将m×m个乘法单元依次编号,并将第一个乘法单元至第m×m个乘法单元的公共输入端分别连接第m×m个REG寄存器的输出端,其中,任意第M个乘法单元的另一输入端接至参数存储单元的第M行存储区;设置乘法单元的公共输入端的传输频率为1/T,与参数存储单元相连的乘法单元的输入端的传输频率为m×m/T;M=1,2,…,m×m;本实施例中,设置乘法单元的公共输入端的传输频率为1/59,与参数存储单元相连的乘法单元的输入端的传输频率为3×3/59,且M=1,2,…,3×3;

第一输入复用的卷积运算模块对卷积神经网络的第k层卷积层进行运算时,先利用式(1)计算硬件资源利用率,并判断硬件资源利用率是否小于“1”;若小于,则表示硬件资源充足,并增加输入复用的卷积运算模块的个数为a,从而利用a个输入复用的卷积运算模块对各自输入的数据进行并行卷积处理,得到第k层卷积层的输出特征图,其中,a与资源利用率成反比;否则,表示硬件资源不足,并利用第一输入复用的卷积运算模块得到第k层卷积层的输出特征图;

硬件资源利用率=FIFO的深度×FIFO的宽度/FPGA内嵌存储器大小 (1);

本实施例中,采用的Spartan-7FPGA采用的内嵌存储器为1024×9bits的M9K,FIFO的深度×宽度为512×9bits,显然硬件资源利用率仅为50%,硬件资源充足,可以对输入通道进行循环展开,实现方式为:采用两个输入复用的输入复用的卷积运算模块对各自输入的数据进行并行卷积处理;

D触发器对乘加树的结果进行累加后,按照乘法单元的顺序,依次输出m×m的矩阵,并作为第k层卷积层的输出特征图;

使用激活模块对第k层卷积层的输出特征图进行激活处理;激活模块采用多路选择器实现K+1层激活层;多路选择器的选择控制端输入m×m的有效数据的符号位,当符号位为“1”时,多路选择器的输出为“0”;当符号位为“0”时,多路选择器的输出为所输入的有效数据,并作为第k层激活层的输出特征图,激活层的MUX实现如图6所示;

激活模块的输出端连接第二REG-FIFO模块的输入端;第二REG-FIFO模块的输出端作为池化模块的输入端;池化模块用于实现K层池化层;

第二REG-FIFO模块读取第k层激活层的输出特征图中一个通道长度为m×m的有效数据并传输给池化模块的输入端;

如图9所示,第k层池化层对第k层激活层的输出特征图进行最大值池化处理,若k<K时,得到的池化结果作为第k+1层卷积层的输入特征图,若k=K时,第K层池化层的输出结果作为全连接层的输入;

第二和第三输入复用的卷积运算模块用于实现2层全连接层;其中,第一层全连接层对第k+1层卷积层的输入特征图和参数存储模块中相应权值参数进行并行化的全连接计算:

将池化模块输出的池化数据的前一半输入第二输入复用的卷积运算模块的公共输入端,再将另一半池化数据输入第三输入复用的卷积运算模块的公共输入端,第二和第三输入复用的卷积运算模块的非公共输入端均接在参数存储模块的输出端,全连接过程示意如图7所示;

第二层全连接层对第一层全连接层的输出数据和参数存储模块中相应权值参数进行并行化的全连接计算:

将第一层全连接层的输出数据的前一半输入第二输入复用的卷积运算模块的公共输入端,再将另一半输出数据输入第三输入复用的卷积运算模块的公共输入端,第二和第三输入复用的卷积运算模块的非公共输入端均接在参数存储模块的输出端;

第二层全连接层的输出数据经过第K+1层激活层处理后,得到的输出结果作为硬件加速器对MNIST手写数字集中数字的识别结果。

本实施例中,一种基于卷积神经网络硬件加速器的并行复用方法是按如下的步骤进行:

步骤1、构建卷积神经网络,包括K层卷积层,K+1层激活层,K层池化层,2层全连接层;设置每层的卷积层均包含有6层循环,其中,1、2层循环的控制因子是卷积核尺寸,用于卷积运算的乘加操作;3、4层循环的控制因子是输出特征图的行、列数,用于将内四层的卷积运算结果按要求格式输出;5、6层循环的控制因子是输出、输入通道数,用于激活操作;设置每层全连接层均包含2层循环,其中,内层循环为卷积层1、2层的乘加循环,外层循环为卷积层5、6层的激活循环;

步骤2、采用MNIST手写数字集对卷积神经网络进行训练,得到权值参数;

步骤3、构建加速器硬件包括:参数存储模块、2个REG-FIFO模块、计数控制模块、3个输入复用的卷积运算模块、激活模块、池化层模块;同时将MNIST手写数字集的图像参数以及训练后的权值参数存入参数存储模块中;

步骤4、定义卷积神经网络的当前卷积层为第k层,并初始化k=1;

步骤5、在卷积神经网络的第k层计算下,若k=1,则第一REG-FIFO模块的输入特征图为MNIST手写数字集中的一张手写数字图片,若k>1,则第一REG-FIFO模块的输入特征图是中间特征图;

步骤6、第一REG-FIFO模块的输入端在接收到输入特征图后,由计数控制模块配合时钟周期t控制,从输入特征图中的(0,0)位置开始,依次逐行读取维度为(m+n)×(m+n)的图像矩阵;

当时钟周期t<m×m+(m-1)×n时,表示第一REG-FIFO模块中未填充到与m×m的卷积核相匹配的输入矩阵,并设置REG寄存器为不可读状态;

当时钟周期t≥m×m+(m-1)×n时,表示第一REG-FIFO模块中已填充到与m×m的卷积核相匹配的输入矩阵,并记录当前时刻T=m×m+(m-1)×n;

步骤7、定义计数控制模块的计数器为i,并初始化i=0;从T-1时刻起,每经过n+1个时钟周期,则计数器i自增1;

步骤8、当i为奇数时,设置REG寄存器为不可读状态;

当i为偶数时,设置REG寄存器为可读状态,在时钟周期t的控制下,将m×m个REG中的数值从左到右依次传输到第一输入复用的卷积运算模块;

步骤9、令第k层卷积层中包含有由m×m个乘法单元串联m×m个加法单元构建的乘加树、以及m×m个D触发器组成,其中m×m个D触发器分别与m×m个加法单元构成前向反馈通道;

乘加树的输入端分别连接至参数存储模块的输出端和第一REG-FIFO模块的REG寄存器的输出端;

如图8所示,利用第一输入复用的卷积运算模块对第k层卷积层的输出通道循环展开:

将第一个乘法单元至第m×m个乘法单元的公共输入端分别连接第m×m个REG寄存器的输出端,其中,任意第M个乘法单元的另一输入端接至参数存储单元的第M行存储区;设置乘法单元的公共输入端的传输频率为1/T,与参数存储单元相连的乘法单元的输入端的传输频率为m×m/T;M=1,2,…,m×m;

步骤10、利用式(1)计算硬件资源利用率,并判断硬件资源利用率是否小于“1”,若小于,则表示硬件资源充足,并执行转步骤11,否则,表示硬件资源不足;并执行转步骤12;

硬件资源利用率=FIFO的深度×FIFO的宽度/内嵌存储器大小 (1)

步骤11、对第k层输入通道进行循环展开:

增加输入复用的卷积运算模块的个数为a,并利用a个输入复用的卷积运算模块对其输入的a组数据进行并行处理,并得到第k层卷积层的输出特征图,其中,a与资源利用率成反比;

步骤12、D触发器对乘加树的结果进行累加后,按照乘法单元的顺序,依次输出m×m的矩阵,并作为第k层卷积层的输出特征图;

步骤13、使用激活模块对第k层卷积层的输出特征图进行激活处理;激活模块采用多路选择器实现K+1层激活层;多路选择器的选择控制端输入m×m的有效数据的符号位,当符号位为“1”时,多路选择器的输出为“0”;当符号位为“0”时,多路选择器的输出为所输入的有效数据,并作为第k层激活层的输出特征图;

步骤14、激活模块的输出端连接第二REG-FIFO模块的输入端;第二REG-FIFO模块的输出端作为池化模块的输入端;池化模块用于实现K层池化层;

从首地址开始池化操作;如图9所示;

步骤15、第二REG-FIFO读取第k层激活层的输出特征图中一个通道长度为m×m的有效数据并传输给池化模块的输入端并进行最大值池化处理;

步骤16、若k<K时,则表示得到的池化结果即为第k+1层卷积层的输入特征图,并将k+1赋值给k后转至步骤17,若k=K时,则表述第K层池化层的输出结果即为全连接层的输入,并转至步骤18;

步骤17、将特征图数据读地址自增1,再跳回步骤15;

步骤18、全连接层对第k+1层卷积层的输入特征图和参数存储模块中相应权值参数进行并行化的全连接计算:

将池化模块输出的池化数据的前一半输入第二输入复用的卷积运算模块的公共输入端,再将另一半池化数据输入第三输入复用的卷积运算模块的公共输入端,第二和第三输入复用的卷积运算模块的非公共输入端均接在参数存储模块的输出端;

第二层全连接层对第一层全连接层的输出数据和参数存储模块中相应权值参数进行并行化的全连接计算:

将第一层全连接层的输出数据的前一半输入第二输入复用的卷积运算模块的公共输入端,再将另一半输出数据输入第三输入复用的卷积运算模块的公共输入端,第二和第三输入复用的卷积运算模块的非公共输入端均接在参数存储模块的输出端;

步骤19、在参数存储模块中,将权值数据的地址自增1;

步骤20、查看编译器运行状态并等待,判断全连接层的当前输入与当前权值的乘加运算是否完成,如果已经完成,则转至步骤21;如果未完成,则跳回步骤18;

步骤21、查看编译器运行状态,判断是否全连接完所有的输入,如果处理完成,则跳转至步骤23,全连接操作结束;如果未完成,则跳转至步骤22;

步骤22、将输入数据的地址自增1;然后,跳回步骤18;

步骤23、全连接层的激活:将特征图数据读地址自增1再使用第K+1层激活层激活;

步骤24、判断所有神经元运算是否完成激活,如果未完成,则跳回步骤23,如果完成,则得到的输出结果作为加速器对MNIST手写数字集中数字的识别结果。

技术分类

06120114696278