基于FPGA的深度卷积神经网络实现方法与流程

文档序号:13760884阅读:826来源:国知局
基于FPGA的深度卷积神经网络实现方法与流程

本发明属于数字图像处理、模式识别技术领域,具体涉及一种在FPGA硬件平台上实现深度卷积神经网络模型的方法。



背景技术:

在当前计算机技术及互联网高速发展的情况下,数据规模呈爆发式增长,海量数据的智能化分析处理成为有效利用数据价值的关键所在。人工智能技术是实现从海量数据中发现有价值的信息的一种有效手段,近年来在计算机视觉、语音识别和自然语言处理等应用领域取得突破性进展。基于深度卷积神经网络的深度学习算法模型是其中的一个典型代表。

卷积神经网络(Convolutional Neural Network,CNN)受神经科学研究的启发。经过20多年的演变,在模式识别,人机对抗等领域取得令人瞩目的理论研究及实际应用成果,在著名的人机围棋对抗赛中,基于CNN+蒙特卡洛搜索树算法的人工智能系统AlphaGo,以4:1大比分优势战胜了世界围棋冠军李世石。典型的CNN算法模型由两部分组成:特征提取器和分类器。其中特征提取器负责生成输入数据的低维特征向量,对数据具有较好的鲁棒性。该向量作为分类器(通常基于传统的人工神经网络)的输入数据进行分类,得到输入数据的分类结果。

在实现卷积神经网络算法模型中,卷积计算占整个算法模型90%的计算量[1],因此卷积层的高效计算是大幅提升CNN算法模型计算效率的关键,通过硬件加速实现卷积计算是一种有效途径。

当前,业内普遍使用GPU集群实现深度学习算法模型,通过大规模并行计算实现深度神经网络模型,取得了令人瞩目的高效率与高性能结果,然而GPU的高功耗也制约了其大规模应用,进而成为深度卷积神经网络算法模型的实际推广应用的瓶颈所在。FPGA具有高性能并行计算和超低功耗的优点,在FPGA上实现深度学习算法模型是该领域的必然发展方向。

目前利用FPGA实现CNN的方案主要有三种:

(1)利用软核CPU实现控制部分,配合FPGA实现算法加速;

(2)利用硬核SoC内嵌的硬核ARM Cortex A9 CPU实现控制部分,配合FPGA实现算法加速;

(3)利用云端服务器配合FPGA实现算法加速。

三种方案各有利弊,根据不同的运用场合,可以选择不同的加速方案。

在深度卷积神经网络中,卷积层计算占用了超过90%的计算量,而且是整个网络模型中承前启后的关键环节,其计算效率直接影响了模型算法实现的性能。然而,在FPGA上实现卷积计算具有很大难度,主要体现在以下几个方面:

(1)深度学习算法模型目前基本还处于学术界研究的阶段,大规模产业化应用还有很多算法及模型优化的工作,因此算法模型需要不断优化,以适应不同的应用场景,需要对深度学习理论及算法有非常深入的理解;

(2)FPGA的研发基于底层的硬件语言,适于算法模型相对稳定的情况,不断变化的深度学习算法模型为其在FPGA上实现带来很大的难度;

(3)在FPGA上实现深度卷积神经网络,需要对FPGA的工程实现具有丰富的经验。FPGA的运行时钟频率和使用的乘法器等模块的输出延时(Latency)互相矛盾,时钟频率越高,模块的输出延时越长,时钟频率越低,模块的输出延时越短。需要借助工程经验通过手工实验找到相对平衡的参数。



技术实现要素:

本发明方法的目的是提供一种高效率、低功耗的实现深度卷积神经网络模型的方法,以解决当前基于GPU或CPU的深度学习模型功耗大、效率低的问题。

本发明对FPGA硬件设计进行了优化,有效降低了资源消耗,能够在低端FPGA硬件平台上实现深度卷积神经网络模型。

本发明提供的实现深度卷积神经网络模型的方法,实现的硬件平台是Xilinx ZYNQ-7030可编程片上SoC,硬件平台内置FPGA和ARM Cortex A9处理器。本发明首先将训练好的网络模型参数加载到FPGA端,然后在ARM端对输入数据进行预处理,再将结果传输到FPGA端,在FPGA端实现深度卷积神经网络的卷积计算和下采样,形成数据特征向量并传输至ARM端,完成特征分类计算。具体包括4个过程:模型参数加载过程、输入数据预处理操作过程、卷积和下采样计算过程、分类计算过程:

1、模型参数加载过程为:

(1)离线训练深度卷积神经网络模型;

(2)ARM端加载训练模型参数;

(3)将模型参数传输至FPGA;

2、输入数据预处理操作过程为:

(1)归一化处理;

(2)将处理结果传输至FPGA;

(3)在FPGA端存储至Block RAM;

3、卷积和下采样计算过程为:

(1)初始化卷积流水线;

(2)卷积计算;

(3)池化下采样计算;

(4)重新初始化卷积流水线,进行多层卷积下采样计算;

4、分类计算过程为:

(1)将特征向量传回ARM端;

(2)通过分类模型计算;

(3)输出分类结果。

具体介绍如下:

步骤1、加载训练模型参数

(1)在ARM端加载离线训练的深度卷积神经网络模型参数;

(2)将训练模型参数传输至FPGA端;

(3)FPGA端经过FIFO缓存后存储在Block RAM(块随机存储器)中;

步骤2、预处理深度卷积神经网络模型

(1)对输入数据进行归一化处理,使其满足模型卷积运算要求;

(2)利用APB总线将ARM端归一化数据传输至FPGA端;

(3)FPGA端将归一化数据经过FIFO缓存后存入Block RAM;

步骤3、卷积和下采样计算

针对深度卷积神经网络模型中计算量最大的卷积层计算,设计深度流水线实现模式。设网络模型有H个卷积层和池化层。第h个(h=1,2,…,H)卷积层输入为T个m×m浮点数(32位)矩阵,输出为S个(m-n+1)×(m-n+1)浮点数(32位)矩阵,卷积核为K个n×n浮点数(32位)矩阵(n≤m),输入数据滑动窗尺度为n×n,横向滑动步长为1,纵向滑动步长为1。

(1)初始化卷积运算流水线

定义n+1个数据缓存寄存器P0,P1,…,Pn-1,Pn,每个寄存器存放m个数据。其中n个寄存器(P(i-1)%(n+1)+0,P(i-1)%(n+1)+1,…,P(i-1)%(n+1)+n-1)存放第t个(t=1,2,…,T)输入数据矩阵的第i个(i=1,2,…,m-n+1)子矩阵(n×m)数据,其中%表示取余数,如果(i-1)%(n+1)+x>n,则(i-1)%(n+1)+x=0,(i-1)%(n+1)+x+1=1,…,其中x=0,1,…,n-1。如果n<m,P(i-1)%(n+1)+n寄存器存放输入数据矩阵中的第i+n行数据,在卷积计算过程中实现并行初始化,以减少FPGA空闲周期,提高计算效率。

定义1个卷积核矩阵缓存寄存器W,存放第k个(k=1,2,…,K)n×n个卷积核矩阵权值数据。

(2)第h个卷积层计算

完成网络第h个卷积层第t个输入数据矩阵和第k个卷积核的卷积计算,通过Sigmoid函数实现计算结果的激活。

具体来说,在进行每次卷积计算的同时,初始化第i+n个数据缓存寄存器P(i-1)%(n+1)+n,作为卷积中第i+1个子矩阵卷积计算的缓存输入数据,实现循环卷积。

在FPGA端通过浮点IP(Floating-point IP)核构建Sigmoid函数,实现卷积计算结果的激活;所述Sigmoid函数的表达式为:。具体步骤为:

如前所述,输入数据为m×m浮点数矩阵,卷积核为n×n浮点数矩阵,滑动窗尺度为n×n,横向滑动步长为1,纵向滑动步长为1,则卷积结果为(m-n+1)×(m-n+1)的浮点数矩阵,矩阵的每个元素加上偏置量b11(离线训练模型参数),利用Sigmoid函数激活后,结果为(m-n+1)×(m-n+1)的浮点数矩阵,存入Block RAM。

完成1次卷积计算后,重新初始化卷积核矩阵缓存寄存器W,进行下一次卷积计算,往复循环卷积计算,计算结果为S个(m-n+1)×(m-n+1)浮点数矩阵,存入Block RAM。

(3)第h个池化层计算

实现第h个卷积层计算结果的池化计算,结果为S个[(m-n+1)/2]×[(m-n+1)/2]浮点数矩阵,存入Block RAM。具体步骤为:设卷积计算结果数据滑动窗尺度为2×2,步长为2,采用平均下采样法实现池化,即逐个2×2浮点数矩阵相加,计算结果取均值,获得S个[(m-n+1)/2]×[(m-n+1)/2]浮点数矩阵,作为第h+1个卷积层计算的输入矩阵。

步骤4、分类计算

将卷积计算和池化计算结果传回ARM端进行分类运算。具体步骤为:FPGA端将Block RAM中的卷积池化计算结果矩阵,通过FIFO缓存,APB总线传输至ARM端,ARM端利用Softmax运算完成数据分类计算,得到输入数据的分类结果并输出。

本发明方法的主要特点有:

(1)在低端FPGA上实现了深度卷积神经网络模型;

(2)利用流水线计算方式实现了深度卷积神经网络模型中的卷积计算加速;

(3)控制芯片采用Soc内嵌ARM处理器实现,具有体积小,功耗低,效率高的特点,可广泛应用于嵌入式系统领域。

本发明利用FPGA的快速并行处理和极低功耗的高效能计算特性,实现深度卷积神经网络模型中复杂度最高的卷积计算部分,在保证算法正确率的前提下,大幅提升算法效率。相比于传统基于CPU或GPU实现深度卷积神经网络的方法,本发明方法在有效提高算法计算速度的同时,大幅降低了功耗,有效解决了采用CPU或GPU实现深度卷积神经网络导致的运算时间长或功耗大的问题。

附图说明

图1基于FPGA的深度卷积神经网络实现流程图。

图2 MNIST数据库(部分)。

图3矩阵转置原理图。

图4流水线计算示意图。

图5卷积计算示意图。

图6 深度卷积神经网络结构图。

图7下采样计算示意图。

图8 基于FPGA的深度卷积神经网络模型仿真结果。

图9 数字“7”的实测分类结果(MNIST数据库)。

具体实施方式

以下结合附图解释运用了本发明方法,在FPGA硬件平台上利用深度卷积神经网络模型实现手写体字符识别算法的具体实施。(该深度卷积神经网络模型由输入层I,第一个卷积层C1,第一个下采样层S1,第二个卷积层C2,第二个下采样层S2和全链接层Softmax组成。输入图片大小为28×28,第一层卷积层包含1个大小为5×5的卷积核,第二个卷积层包含3个大小为5×5的卷积核)。

利用深度卷积神经网络模型的手写体字符识别算法在FPGA上实现的具体运算步骤如附图1所示。

1、加载训练好的模型参数

首先参考DeepLearnToolbox-master中CNN的函数,并进行一定的修改(将卷积函数重写,并将神经网络层数改为5层,一个输入层,两个卷积层,两个下采样层;第一个卷积层1个大小为5×5的卷积核,第二个卷积层3个大小为5×5的卷积核,两个下采样层的滑动步长为2,滑动窗2×2矩阵,训练次数设为10),利用Matlab训练深度卷积神经网络,然后在ARM端加载训练好的权值参数和偏置参数,最后将训练好的模型参数传输至FPGA端,经过FIFO缓存后存储在Block RAM中。

2、预处理

附图2所示的MNIST手写体图像读入内存,每个像素除以255进行归一化,然后按照附图3所示进行转置。

3、将预处理结果传输至FPGA

通过ZYNQ-7030 Soc上APB总线,将预处理结果传输至FPGA端,经过FIFO缓存后存储在Block RAM中。

4、初始化卷积运算流水线

如附图4所示,定义6个数据缓存寄存器P0,P1,P2,P3,P4,P5,每个寄存器可存放28个浮点数数据。其中5个寄存器(P(i-1)%(5+1)+0,P(i-1)%(5+1)+1,…,P(i-1)%(5+1)+5-1)存放输入图像矩阵的第i个(i=1,2,…,24)子矩阵(5×28)数据,其中%表示取余数。如果(i-1)%(5+1)+x>5,则(i-1)%(5+1)+x=0,(i-1)%(5+1)+x+1=1,…,其中x=0,1,…,4。P(i-1)%(5+1)+5寄存器存放输入图像矩阵中的第i+5行数据。

定义1个卷积核矩阵缓存寄存器W,存放第1个卷积层的1个5×5个卷积核矩阵权值数据。

5、进行第1个卷积层计算

完成网络第1个卷积层输入图像矩阵和第1个卷积层第1个卷积核的卷积计算,通过Sigmoid函数实现计算结果的激活。

在进行卷积计算的同时,初始化第i+5个数据缓存寄存器P(i-1)%(5+1)+5,作为卷积中第i+1个子矩阵卷积计算的缓存输入数据,实现循环卷积,如附图5所示。

在FPGA端通过浮点IP(Floating-point IP)核构建Sigmoid函数,实现卷积计算结果的激活。Sigmoid函数的表达式为:。

具体步骤为:

如前所述,输入图像为28×28浮点数矩阵,卷积核为5×5浮点数矩阵,滑动窗尺度为5×5,横向滑动步长为1,纵向滑动步长为1,则卷积结果为24×24的浮点数矩阵,矩阵的每个元素加上偏置量b11(离线训练模型参数),利用Sigmoid函数激活后,结果为24×24的浮点数矩阵,存入Block RAM。

完成1次卷积计算后,计算结果为1个24×24浮点数矩阵,存入Block RAM。

6、进行第1个池化层计算

实现第1个卷积层计算结果的池化计算,如附图6所示,结果为1个12×12浮点数矩阵,存入Block RAM。具体步骤为:卷积计算结果数据滑动窗尺度为2×2,步长为2,采用平均下采样法实现池化,即逐个2×2浮点数矩阵相加,计算结果取均值,获得1个12×12浮点数矩阵,作为第2个卷积层计算的输入矩阵,如附图7所示。

7、重新初始化卷积流水线

如附图4所示,重新初始化6个数据缓存寄存器P0,P1,P2,P3,P4,P5,每个寄存器存放12个浮点数数据。其中5个寄存器(P(i-1)%(5+1)+0,P(i-1)%(5+1)+1,…,P(i-1)%(5+1)+5-1)存放输入矩阵的第i个(i=1,2,…,8)子矩阵(5×12)数据,其中%表示取余数。如果(i-1)%(5+1)+x>5,则(i-1)%(5+1)+x=0,(i-1)%(5+1)+x+1=1,…,其中x=0,1,…,4。P(i-1)%(5+1)+5寄存器存放输入矩阵中的第i+5行数据。

重新初始化卷积核矩阵缓存寄存器W,存放第2个卷积层的第1个5×5个卷积核矩阵权值数据。

8、进行第2个卷积层计算

完成网络第2个卷积层输入数据矩阵和第2个卷积层第1个卷积核的卷积计算,通过Sigmoid函数实现计算结果的激活。

重新初始化卷积核矩阵缓存寄存器W,存放第2个卷积层的第2个5×5个卷积核矩阵权值数据,完成网络第2个卷积层输入数据矩阵和第2个卷积层第2个卷积核的卷积计算,通过Sigmoid函数实现计算结果的激活。

重新初始化卷积核矩阵缓存寄存器W,存放第2个卷积层的第3个5×5个卷积核矩阵权值数据,完成网络第2个卷积层输入数据矩阵和第2个卷积层第3个卷积核的卷积计算,通过Sigmoid函数实现计算结果的激活。

在进行每次卷积计算的同时,初始化第i+5个数据缓存寄存器P(i-1)%(5+1)+5,作为卷积中第i+1个子矩阵卷积计算的缓存输入数据,实现循环卷积,如附图5所示。

具体步骤为:如前所述,输入图像为12×12浮点数矩阵,卷积核为3个5×5浮点数矩阵,滑动窗尺度为5×5,横向滑动步长为1,纵向滑动步长为1,则卷积结果为3个8×8的浮点数矩阵,3个矩阵的每个元素分别加上偏置量b21,b22,b23(离线训练模型参数),利用Sigmoid函数激活后,结果为3个8×8的浮点数矩阵,存入Block RAM。

完成2次卷积计算后,计算结果为3个8×8浮点数矩阵,存入Block RAM。

9、进行第2个池化层计算

实现第2个卷积层计算结果的池化计算,如附图6所示,结果为3个4×4浮点数矩阵,存入Block RAM。具体步骤为:卷积计算结果数据滑动窗尺度为2×2,步长为2,采用平均下采样法实现池化,即逐个2×2浮点数矩阵相加,计算结果取均值,获得3个4×4浮点数矩阵,作为Softmax层的输入矩阵,如附图7所示。

10、分类计算

将卷积计算和池化计算结果传回ARM端进行分类运算。具体步骤为:FPGA端将Block RAM中的卷积池化计算结果矩阵,通过FIFO缓存,APB总线传输至ARM端,ARM端利用Softmax运算完成数据分类计算,得到输入图片的分类结果并输出。

上述方法处理MNIST数据库中数字图片“7”的仿真结果如图8所示。

上述方法处理MNIST数据库中数字图片“7”的实测分类结果如图9所示。

参考文献

[1] Cong J, Xiao B. Minimizing Computation in Convolutional Neural Networks[M]// Artificial Neural Networks and Machine Learning – ICANN 2014. Springer International Publishing, 2014:33-7.

[2] Farabet C, Poulet C, Han J Y, et al. CNP: An FPGA-based processor for Convolutional Networks[J]. International Conference on Field Programmable Logic & Applications, 2009:32-37.

[3] Gokhale V, Jin J, Dundar A, et al. A 240 G-ops/s Mobile Coprocessor for Deep Neural Networks[C]// IEEE Embedded Vision Workshop. 2014:696-701.

[4] Zhang C, Li P, Sun G, et al. Optimizing FPGA-based Accelerator Design for Deep Convolutional Neural Networks[C]// Acm/sigda International Symposium. 2015:161-170.

[5] Krizhevsky A, Sutskever I, Hinton G E. ImageNet Classification with Deep Convolutional Neural Networks[J]. Advances in Neural Information Processing Systems, 2012, 25(2):2012.

[6] Farabet C, Martini B, Corda B, et al. NeuFlow: A runtime reconfigurable dataflow processor for vision[J]. 2011, 9(6):109-116.

[7] Matai J, Irturk A, Kastner R. Design and Implementation of an FPGA-Based Real-Time Face Recognition System[C]// IEEE, International Symposium on Field-Programmable Custom Computing Machines. 2011:97-100.

[8] Sankaradas M, Jakkula V, Cadambi S, et al. A Massively Parallel Coprocessor for Convolutional Neural Networks[C]// IEEE International Conference on Application-Specific Systems, Architectures and Processors. IEEE Computer Society, 2009:53-60.。

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