目录
1 项目构思
这里先写一点关于项目的构思,在后期实现过程中会慢慢填坑。
学习FPGA也有快一个月了,语言学的差不多了,准备实际上手一些项目。最近也阅读了一些关于优化CNN在硬件上的论文,运用loop pipeline或者loop unroll等优化计算。但突然发现自己现在最需要的还是先在FPGA上实现一个深度学习应用,于是还是先把目标放在了ANN上,也就是简单的全连接网络实现识别手写数字mnist数据集。
首要考虑的就是MAC与激活函数的实现。MAC就是乘加器,一个ANN单元必不可少的东西,激活函数呢,本来是一个连续函数,如何用离散的方式实现呢?目前还不清楚,看别人的项目是调用的现成IP核。这个问题值得看一下。相对于ANN,CNN的计算就显得简单粗暴了,卷积层的计算方式看起来很简单,但要考虑卷积核间并行与卷积层间并行问题,以及DSP单元(因为大多数CNN网络参数量很大,需要转定点数计算,便使用了DSP资源)资源分配问题。(当然不上板只是仿真的话不需要考虑实际硬件资源问题)
第二就是,数据读写。网络参数需要写成coe文件输入FPGA,或者小点的网络直接在代码中初始化,但这样很难修改网络参数与结构。另外图片数据的输入,可能还是需要加载到片外memory。
第三,数据量化。我们在FPGA上实现的是inference阶段,也就是前向传播的过程。训练这一过程是在其他平台进行的,因为训练这一部分并不能利用好FPGA的优势,FPGA主要还是在非批处理的时候,可以以很低的延迟进行图像处理,所以在部署到类似智能汽车里面的障碍物识别等应用中。在这里我们使用浮点数,因为网络很小,所以可能不需要考虑浮点数转定点等量化问题。但实际项目中,参数量化的问题是值得深入探讨的,如何在参数量化的同时不造成太多精度损失,这值