基于FPGA的卷积神经网络加速器_余子健

本文探讨了基于FPGA的卷积神经网络(CNN)加速器设计,深入分析了卷积层的并行计算策略,包括卷积窗口内部、特征图间及不同输出特征图的并行实现。同时,介绍了激活函数的多种实现方法,如泰勒级数展开、查找表、分段线性逼近和CORDIC算法,以及加速器的整体结构和卷积计算单元的设计。


这是浙大余子健的研究生毕业论文,也是我阅读的第一篇文献。

1. 神经网络计算模型

上图为典型的卷积神经网络的结构。在图中C层代表的是卷积层,S层是子采样层,F代表全连接层。C层与S层是交替出现的。卷积层即特征提取层,子采样层可以二次平均和局部提取。卷积层是FPGA要加速的重点

上图是一个典型的卷积层,N个输入特征图,M个输出特征图,将会有N*M个卷积核 (Kernals)。这点我觉得很重要:不同的输入特征图,卷积核一定不同;不同的输出特征图,卷积核也一定不同。
具体的卷积和子采样计算过程不赘述。

2. 卷积计算并行性分析

这一部分是整个论文的核心。在该部分的讨论中,所有的并行情况都单独考虑,不设计多个组合的情况。

2.1 卷积窗口内部并行

即某一个卷积窗口的卷积计算的并行。通常在实现时会加入流水线技术,并行度为N时在单周期可完成N次乘累加。

一个小错误:上图中最左上角的X(n, 0)应该是X(n, 3)。
以第一行(行n)为例来说明该流水线是如何工作的,在第一个时钟周期,执行X(n, 0)*W00;第二个时钟周期,X(n, 1)*W01,并加上X(n, 0)*W00的计算结果, 此外,第一级流水线还会计算X(n, 1)*W00,即下一个卷积窗口的第一个计算值;第三个时钟周期,第三级流水线执行X(n, 2)*W02 + X(n, 1)*W01 + X(n, 0)*W00,第一级流水线执行X(n, 2)*W00,第二级流水线执行X(n, 1)*W00 + X(n, 2)*W01。以此类推。

2.2 相同特征图卷积窗口间并行实现分析

相同特征图内不同卷积窗口的并行,易理解如下图。

2.3 不同输入特征图卷积窗口并行

如上图所示为不同输入特征图的同一卷积窗口的并行,原理很好理解。

2.4 不同输出特征图并行

原理与不同输入特征图的并行基本相同。
到这里为止,四种由小到大,由细到粗的并行结构就结束了,这四种并行结构可以进行组合,在数据带宽和运行效率之间做出平衡。

3. 激活函数的实现

神经元的缴活函数实现是一个重要的环节,其导数的变化范围影响网络的收敛速度和学习速度。常用的激活函数有sigmoid,双曲正切等。激活函数的数字电路实现方式主要有以下方式:

  1. 泰勒级数展开
    可通过求激活函数的五阶泰勒级数来实现。这种方法精度损失小,占用很少存储器空间,但需要比较多的计算单元,并且通用性差。
  2. 简单的查找表
    通过传统的查找表方式将所有结果保存在存储器中来实现。这种方法具有较高的灵活性,精度可任意调整,消耗运算资源少,但随着精度要求的提升,存储器资源的负担也指数增长。例如一个16位输入,16位输出的查找表,其消耗的存储器大小为128KB。
  3. 分段线性逼近
    分段线化(PWL)逼近的基本思想是用一系列折线来逼近激活函数。在实现的时候,可将分段函数的断点存入查找表,断点间的区间用线化函数来得到中间值。这种方式占用存储器资源少于查找表,消耗计算单元也小于泰勒展开。
    PWL实现方式如下:在函数f(x)上选择一个线性区,并设定最大允许误差。比较线性区原函数与线性函数之间的误差,直至到达最大误差时,从该点开始一个新的线性区。重复上述操作直至函数定义域内所有区域均已遍历。
  4. CORDIC算法
    CORDIC算法本质是利用一组常数的角度基底去逼近任意一个旋转角度,通过多次迭代可得到任意分辨率输入数据的结果,消耗一定的运算资源,适合精度要求较高的实现场合。
4. 基于FPGA的加速器设计
4.1 整体结构

加速器的整体结构如上图所示。注意,要加速的过程是前向预测过程,反向训练以得到参数的过程是在主机上完成的。 主机把权值和图像以及指令传给FPGA,FPGA计算结束后将结果传回主机。

4.2 卷积计算单元

卷积运算是本次设计的优化重点,其实现决定了CNN计算单元的整体结构。由于CNN是一个前向传播结构,层间运算具有独立性且各层运算具有高度相似性,因此可通过复用单层运算资源来实现完整的CNN神经网络计算,在实现过程中只需实现单层的卷积计算结构。
在这里插入图片描述

上图是计算过程。在该实例中,有4副输入特征图,4副输出特征图,核的大小为3*3,上图中分左边阶段和右边阶段。采用并行性组合的方式,输出特征图之间的并行度为2,即同时计算两个输出特征图;输入特征图之间的并行度为2,即同时计算两个输入特征图;同一输入特征图不同卷积窗口的并行度为2,即同时计算两个卷积窗口。
如右阶段所示,把两输出特征图的计算完成后,接着计算剩下两副输出特征图的结果。

内容概要:本文档围绕《【硕士论文复现】可再生能源发电与电动汽车的协同调度策略研究》展开,重点介绍如何通过Python代码实现可再生能源(如风电、光伏)与电动汽车(EV)在电力系统中的协同调度优化。研究构建了多时间尺度的能量协调调度模型,综合运用智能优化算法,提升电网对波动性电源的消纳能力,并充分挖掘电动汽车作为移动储能单元的灵活性潜力。文档涵盖微电网优化、有序充电管理、电力系统仿真等关键技术背景,并提供了完整的代码资源与复现路径,便于读者深入理解和实践。; 适合人群:具备一定电力系统基础知识、优化建模能力和Python编程技能的研究生、科研人员及从事新能源、智能电网等相关领域的工程技术人员。; 使用场景及目标:① 学习并复现高水平硕士论文中的协同调度模型,掌握可再生能源与电动汽车互动的核心建模方法;② 应用于微电网能量管理、电动汽车集群调度、低碳电力系统规划等实际科研与工程项目;③ 为后续开展多能互补、需求响应、分布式优化等前沿方向的研究奠定技术基础。; 阅读建议:建议读者结合提供的Python代码与可能的仿真平台(如Simulink),参照文档指引逐步操作,重点关注优化模型的数学推导、约束设定与求解器(如YALMIP)的调用方式,通过动手实践加深对协同调度机制的理解,以实现高效复现与创新拓展。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值