- 博客(11)
- 收藏
- 关注
原创 卷积神经网络前向、反向传播公式推导
最近看了两篇关于FPGA做训练的文章,发现在FPGA做训练很少有人做,就觉得肯定是哪里有问题导致大家不愿意做训练,于是研究了一下CNN的反向传播。但是发现网上的blog大多只是简单的从理论角度推导了一下最基本的情况(以及互相抄袭互相转载),并没有考虑到大多数情况,所以这里除了把一些大家都讲烂了的基本情况抄袭一遍之外,增加一些比较有趣的问题。这里按照AlexNet结构的CNN模型,先讲解前向传播再反推反向传播。Pytorch官网给出的AlexNet结构如下:Conv2d(3, 64, kernel_siz
2021-02-01 19:23:17 3965 2
原创 FPGA+CNN论文分类整理
开个新坑,最近在读FPGA+DL方面的论文,进行分类整理一下,暂时分为下面几类,如果有发现其他方面再慢慢添加。另外,这里先暂时只做分类整理,都是粗略的读了abstract和contribution,将每个方向的论文尽可能的找到源头,方便后续详读的时候按顺序进行。注意!!!如果有的论文链接打不开请及时留言如果有任何觉得缺失的欢迎私信,我会加进去快速计算快速计算分为两种,一种是利用快速算法,快速算法主要是FFT和Winograd算法,能够加快卷积运算。其中FFT更适合于卷积核较大的情况下,Winogr
2020-10-16 21:47:45 7871 17
原创 基于FPGA的卷积神经网络实现(九)池化模块、全连接模块与输出
池化模块应该是最简单的一个模块了,池化要做的就是等待四个数据的投喂,然后吐出去一个数据。这个逻辑是不是看起来很眼熟?没错,这就是卷积模块的逻辑,卷积模块其实就是等待9个数据的投喂(假设卷积核大小是3×33\times 33×3)然后吐出去一个数据(当然这个数据只是当前通道的数据并不是最终的输出,还需要做一步处理。)所以整体的逻辑就不再赘述了,这里只说一下池化操作。池化操作有很多种,常用的就是最大值池化和均值池化。最大值池化非常适合FPGA运算,因为仅仅为逻辑运算,比较出一个最大值就好了,这里由于池化的尺寸
2020-10-07 16:10:40 9401 26
原创 基于FPGA的卷积神经网络实现(八)卷积模块
将卷积展开后要进行的运算实质上是大规模矩阵运算,因此卷积模块的实现时最容易的,什么都不需要考虑,数据按顺序来了就计算,而这个顺序是数据读取部分需要考虑的,计算完了输出去这部分是下一层的数据数据存储部分需要考虑的。因此整体而言,整个网络模型中最容易实现的却是这里面最核心的计算部分。言归正传。首先要对卷积的循环进行分析,这也是很多基于FPGA的CNN加速器里面所重点研究的。这里推荐一篇FPGA2017的论文,对循环的优化做了比较详细的分析。我们的demo就用最简单的方式进行了。卷积循环分为四层,这里引用上面
2020-10-07 15:07:21 10895 23
原创 基于FPGA的卷积神经网络实现(七)数据读写
写在最前面的闲话:前面我们用了很大的篇幅来说如何去做前期准备,实际上,在FPGA实现CNN最难的地方也就在于前期的设计与规划,后面的Verilog部署那就是体力活+经验活了,拼排流水的功底。所以做好前期准备是非常重要的。这个系列的博文由于是为了给新手一个入门的思路,因此很多细节都没有考虑,真正的循环如何去展开如何去并行,可以看看论文,推荐一篇2017年的很经典的论文《Optimizing Loop Operation and Dataflow in FPGA Acceleration of Deep Co
2020-07-24 16:33:55 9241 22
原创 基于FPGA的卷积神经网络实现(六)数据量化(2)
上一节我们介绍了如何对一个离线模型进行简单的线性量化,这一节我们来说一下如何在Pytorch上面训练一个量化模型。这一节可能是彻底脱离了FPGA实现,想要安心做FPGA实现的可以跳过这一节。首先在Pytorch实现有两种情况,一种是训练的时候就是用int类型,另一种是训练的参数进行量化,但是使用float来表示。另外就是在实现过程中,现在的研究大家使用了各种各样的trick来减小量化带来的误差,从而进一步减小bit位宽,这不是我们研究的重点,真要研究起来这个领域也是非常的深奥,这里我们仅围绕如何在一个模型
2020-07-20 12:06:15 6167 22
原创 基于FPGA的卷积神经网络实现(五)数据量化(1)
这一节主要是软件层面的处理。之所以要进行数据的量化,一个是为了能够使用低bit来表达整个网络从而达到对其压缩的目的,减小对存储空间的需求;二就是FPGA中的DSP单元属于定点数DPS单元,更善于处理定点数运算。定点数量化方面的研究有很多,基本上16bit不会对模型造成损失,使用8bit经过一些trick之后损失也很小,研究方面人们已经开始关注更低的位宽,但是目前在实现上,完全使用更低位宽确实会带来较大的损失,因此最佳的办法是使用动态的量化方式,也就是说对于不同的层不同的数据使用不同的量化位宽。动态量化方面
2020-07-18 10:45:25 11345 20
原创 基于FPGA的卷积神经网络实现(四)资源分配(2)
上一节我们分析了demo需要的存储空间上限和DSP单元的分配可能方案,这一节我们将前面提到的可行的方案进行比较,并将存储空间的优化考虑进来。首先这四种可能的DSP单元分配方案方案列举一下:List item...
2020-07-04 21:48:31 7747 21
原创 基于FPGA的卷积神经网络实现(三)资源分配(1)
前面曾经说过这个demo使用最简单的方法,也就是对每一层都单独分配资源,所以需要提前设计好每一层所分配的资源数量。这里的资源主要是指DSP单元和片上存储资源。仍然是从最简单的方式开始,整个demo的网络结构很小而简单(网络结构在这里),再买上一块儿略屌的板子,比如说zynq7000-zc706(这板子确实很贵,但是一开始我们可以只是仿真,对于上板可以等基本掌握了这种设计思路之后,再进行优化,然后对于不同的板子进行不同的设),19.1M block RAM,900DSP单元(详细信息)。现在网络框架有了板子也
2020-07-02 21:46:25 12102 25
原创 基于FPGA的卷积神经网络实现(二)框架
首先设计整体框架,再根据整体结构去设计每一个子模块,通过例化子模块来形成完整的工程程序。也就是基于FPGA的卷积神经网络实现里面的top.v文件。本项目要实现的神经网络结构如下图所示:对于在FPGA当中实现神经网络而言,每一种功能的层都单独设计一个子模块。而使用这些子模块搭建一个完整的网络框架主要有两种方法:每一层都单独进行例化,占用单独的硬件资源。同样功能的层复用同一部分硬件资源,通过parameter来进行区分本项目为了初学者放心食用选择比较简单的第一种方式,当然前提是硬件资源足够多的,
2020-06-12 22:35:19 15806 22
原创 基于FPGA的卷积神经网络实现(一)简介
目录:简介框架资源分配(1)资源分配(2)数据量化(1)数据量化(2)数据读写卷积模块池化、全连接与输出事先声明,仅用于记录和讨论,有任何问题欢迎批评指正,只是觉得菜的大佬们请绕路,就不用在这里说大实话了,因为本身就是一个粗糙的demo。ISE的v文件在github,由于大家想要vivado工程,我就做了一个,有点大,传到了百度网盘。链接:https://pan.baidu.com/s/1OEUPTEQ3miRcPFCaWy-3MA提取码:bqit提起把项目代码讲解一下的念头主
2020-06-02 22:00:59 36332 16
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人