热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于FPGA的卷积神经网络实现(七)卷积模块

将卷积展开后要进行的运算实质上是大规模矩阵运算,因此卷积模块的实现时最容易的,什么都不需要考虑,数据按顺序来了就计算,而这个顺序是数据读取部分需要考虑的,计算完了输出去这部分是下一

将卷积展开后要进行的运算实质上是大规模矩阵运算,因此卷积模块的实现时最容易的,什么都不需要考虑,数据按顺序来了就计算,而这个顺序是数据读取部分需要考虑的,计算完了输出去这部分是下一层的数据数据存储部分需要考虑的。因此整体而言,整个网络模型中最容易实现的却是这里面最核心的计算部分。
言归正传。首先要对卷积的循环进行分析,这也是很多基于FPGA的CNN加速器里面所重点研究的。这里推荐一篇FPGA2017的论文,对循环的优化做了比较详细的分析。我们的demo就用最简单的方式进行了。
卷积循环分为四层,这里引用上面说的论文中的伪代码图。
基于FPGA的卷积神经网络实现(七)卷积模块
分别解释一下:

  1. Loop1:是指卷积核的xy方向计算
  2. Loop2:是指滤波器不同输入通道的卷积核
  3. Loop3:是指滤波器在特征图上面的滑动
  4. Loop4:是指多个滤波器

循环真正影响到的应该是数据的读取时序。循环1要做的是读取一个卷积核的参数和特征图中对应的部分进行乘加运算;循环2要做的是循环读取不同的输入通道的卷积核和特征图数据;循环3要做的是在特征图上滑动,也就是说循环的在特征图上读取以不同像素为中心的数据块;循环4要做的是循环读取不同的滤波器。而卷积模块中就是要针对于这些数据读取顺序进行相应的计算。
这部分优化的方法有很多,举个例子,对于大型的网络模型而言,大多数参数和特征图是要存在片外的,而片外访存的代价是很大的,因此尽可能的进行数据复用是非常有效的优化方式,因此有些研究对循环进行的顺序交替,来提升数据的复用效率,在此不再赘述,有兴趣的同学可以去看看17/18年的论文,对这部分的讨论已经很清晰了。
我们仅仅使用最简单的方式,也就是最原始的4层循环来进行。下面要做的就是在模块中设计一个乘法阵列,也就是很多研究中所说的PE阵列、脉动阵列之类的,都是相似的思想。
这里我们调用DSP单元用作定点数乘法器设计。注意,这里使用的是定点数乘法器,也就是说,我们前面提到的定点数量化在这里派上了用场,根据前面的量化位宽来对DSP乘法器进行设计。
这里有一个trick可以使用一个DSP进行多个定点乘法操作,详见这里。
得到的结果还需要进行位宽截断处理。举个例子。如果我们使用8bit进行量化,那么我们得到的乘法输出是16bit数据,再经过加法运算,会进一步增大位宽,假设 3 × 3 3 \times 3 3×3的卷积核,那么加法结果会变成20bit,而下一层的输入仍需要8bit位宽。这时候就需要在软件层面进行量化的时候就设计好,在这一层需要保留多少位小数位。假设需要保留4位小数位,而之前的8bit输入是3位小数位,那么结果应该是有6位小数位,也就是说我们需要去掉最后的2位(好像还是很大,这说明什么?要不然高位全是0,要不然就不可能存在3位4位小数的样子。总之这里要在软件层面量化的时候就要考虑好)。
要注意的是,我们除了卷积的乘加运算之外,还有bias 的加法运算,这里的量化也需要对小数位进行对齐。
最后,我们还可以在这一层加入**函数,如果是ReLU就很舒服了,直接判断一下输出的符号位,是1就输出0,是0就输出原始数据,其他的也一样,只需要在流水线的最后加上一级判断就可以得到**值。一般来说,如果使用了一些其他如sigmoid的**函数,是要使用分段线性函数进行拟合的,这样虽然会产生一定的误差,但是如果在软件模型就使用了分段线性函数,那么模型是可以学习到这种的误差的,而使用分段线性函数,那么这里的计算就又变成了和ReLU类似的选择和乘法运算。值得注意的是,一般而言为了减少乘法数量,我们会选择使用2的幂作为分段斜率,从而将乘法转化为移位运算。
理论说完了,我们来看一下程序中是如何做的。
首先是一个基础计算单元,这个单元中可以设置卷积核的尺寸,从而得知累加需要的时钟个数。也就是说PE单元中将会完成Loop1的内容。详细见这里。
在外层模块我们使用了generate来进行循环布线,这是verilog语法中一种比较便利的可以进行并行化布线的方式,即循环内的所有内容都会并行的进行布线。
第一组循环使用嵌套的方式完成了Loop2和Loop4的乘法计算内容。这里值得注意的是,存在着输入通道为1的特殊情况,如果不为1呢?可以参考这里。
第二组循环中对乘法的结果进行的顺序整合,以便于后面池化层进行池化操作。另外,这里还进行了截位处理和一次选择运算,也就是前面提到的位宽对齐和ReLU**函数。
第三组循环将输出进行整合,便于模块间通信。
第四组循环用于将输入数据进行拆分,分散给不同的基础计算单元。
第五组循环用于将输入的权重进行拆分,分散给不同的基础计算单元。
整个模块可以提供了大量的parameter,可以很方便的进行配置。
细心的朋友可能会发现,这里缺少了Loop3的计算部分。这是因为我们将Loop3和Loop4进行了交换,并将Loop3归入了上一节数据读写模块当中。
这就是卷积模块的全部内容了。这部分程序设计还是蛮容易的,因为涉及到的时序问题很少,都是一些并行问题。而这部分优化主要是结合数据读写部分的优化,如循环展开、交换等,还有DSP的复用技术,定点数量化bit位宽越低,DSP可以计算的定点数乘法个数越多。
另外一种优化策略涉及到整个模型的改变,也就是使用快速算法,如FFT、Winograd算法,很多文章对此进行了研究,比如FPGA2018的这篇就使用了Winograd算法。这方面我没有过多的研究,感兴趣的朋友可以自己研究一下。


推荐阅读
  • 模糊神经网络的训练策略与学习算法优化
    本文探讨了模糊神经网络的训练策略与学习算法优化,详细分析了基于FPGA和MATLAB的实现方法。通过改进的学习算法,提高了模糊神经网络在复杂环境下的适应性和准确性,为相关领域的研究者提供了有价值的参考和技术支持。 ... [详细]
  • CSWS_E_ROB深度估计方法
    论文链接:https:arxiv.orgpdf1708.02287.pdf正文翻译概述……首先,我们把深度估计看做一种多类别的密集标记任务,然后与基于公式的 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 如何撰写数据分析师(包括转行者)的面试简历?
    CDA数据分析师团队出品,作者:徐杨老师,编辑:Mika。本文将帮助您了解如何撰写一份高质量的数据分析师简历,特别是对于转行者。 ... [详细]
  • 能够感知你情绪状态的智能机器人即将问世 | 科技前沿观察
    本周科技前沿报道了多项重要进展,包括美国多所高校在机器人技术和自动驾驶领域的最新研究成果,以及硅谷大型企业在智能硬件和深度学习技术上的突破性进展。特别值得一提的是,一款能够感知用户情绪状态的智能机器人即将问世,为未来的人机交互带来了全新的可能性。 ... [详细]
  • 从2019年AI顶级会议最佳论文,探索深度学习的理论根基与前沿进展 ... [详细]
  • 理工科男女不容错过的神奇资源网站
    十一长假即将结束,你的假期学习计划进展如何?无论你是在家中、思念家乡,还是身处异国他乡,理工科学生都不容错过一些神奇的资源网站。这些网站提供了丰富的学术资料、实验数据和技术文档,能够帮助你在假期中高效学习和提升专业技能。 ... [详细]
  • 超分辨率技术的全球研究进展与应用现状综述
    本文综述了图像超分辨率(Super-Resolution, SR)技术在全球范围内的最新研究进展及其应用现状。超分辨率技术旨在从单幅或多幅低分辨率(Low-Resolution, LR)图像中恢复出高质量的高分辨率(High-Resolution, HR)图像。该技术在遥感、医疗成像、视频处理等多个领域展现出广泛的应用前景。文章详细分析了当前主流的超分辨率算法,包括基于传统方法和深度学习的方法,并探讨了其在实际应用中的优缺点及未来发展方向。 ... [详细]
  • 不用蘑菇,不拾金币,我通过强化学习成功通关29关马里奥,创造全新纪录
    《超级马里奥兄弟》由任天堂于1985年首次发布,是一款经典的横版过关游戏,至今已在多个平台上售出超过5亿套。该游戏不仅勾起了许多玩家的童年回忆,也成为强化学习领域的热门研究对象。近日,通过先进的强化学习技术,研究人员成功让AI通关了29关,创造了新的纪录。这一成就不仅展示了强化学习在游戏领域的潜力,也为未来的人工智能应用提供了宝贵的经验。 ... [详细]
  • 在Matlab中,我尝试构建了一个神经网络模型,用于预测函数 y = x^2。为此,我设计并实现了一个拟合神经网络,并对其进行了详细的仿真和验证。通过调整网络结构和参数,成功实现了对目标函数的准确估计。此外,还对模型的性能进行了全面评估,确保其在不同输入条件下的稳定性和可靠性。 ... [详细]
  • 在本文中,我们将深入探讨斯坦福大学机器学习课程第二部分的核心内容与学习体会。文章不仅涵盖了正则化(Regularization)等关键概念,还结合实际案例分析了这些理论在实践中的应用,帮助读者更好地理解和掌握机器学习的高级技巧。此外,我们还将分享一些学习过程中遇到的挑战及解决方案,为后续学习者提供参考。 ... [详细]
  • 数据科学笔记26:深入解析随机森林分类算法及其在Python和R中的应用
    ### 摘要随机森林是一种在集成学习领域备受推崇的算法,被誉为“集成学习技术的典范”。该方法因其简洁性、易实现性和较低的计算成本而被广泛应用。本文将深入探讨随机森林的工作原理,特别是其在Python和R中的具体应用。随机森林通过结合多个决策树和Bagging技术,有效提高了模型的准确性和鲁棒性。我们将详细解析其核心机制,并通过实际案例展示如何在不同编程环境中高效实现这一强大的分类算法。 ... [详细]
  • 最近在看GitHub上的一个很火的项目是:ImageSharp。这是一个纯.netcore的图像处理库,没有使用其他的任何依赖。在看这个项目过程中激发了我对图像文件编码解码的兴趣。 ... [详细]
author-avatar
多伦多打折优惠信息_205
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有