神经网络LeNet5的 的 FPGA RTL级实现 4

        前面讲解了C程序的基本情况,下面就是重中之重 —— 数据如何使用。也就是群中分享的文件。首先看两个文件夹

       dat_save_img5    --->  此文件夹中采用MNIST数据集里第五张图的数据。方便在matlab中导入。

      dat_save_img5_fpga   --- > 此文件夹中的数据与上面的一样,只是采用里并行输出方式,方便在FPGA中导入。当然你在FPGA中采用上一个文件夹中的数据完全没问题。

 

      例如 权重 W23 在上述两个文件夹中分别是。第二种排列,我将数据导入到FPGA的rom中,一个地址读一次就可以将一个 5x5的权重矩阵读出来,第一种排列导入到rom中就需要递增25个地址读25次。就是这个差别了。

                                   

        

        下面说第一层数据的引用。

        第一层,输入数据为 32x32 的矩阵,打开txt文件一张二值化的 4  显现出来,这个在之前的 2 章节有截图。这个 32x32 的图像经过了 6 个 5x5的卷积核,卷积之后出来了 6 张 28x28 的小图。打开 dat_save_img5_fpga 中的 lay1_dat.txt 还可以分辨出6张4的二值化小图。整个运算过程是什么样子的呢? 便于理解我将 matlab中的程序贴一部分出来,三张图依次是 导入txt数据(cell),转换成double类型准备运算,运算过程

      妥妥的 5x 5 卷积之后再加上一个 bias,然后relu一下  ——   负数就归0.  第一层 OVER !所以用FPGA实现 神经网络是很简单的(需要一个量化后的精度验证环境)。需要注意一点的是,matlab中强制类型转换默认是四舍五入,导致和C语言中的导出的数据有一点点差别,但是不影响最终的结果。

       下面一层是pooling ,就是简单的2x2的矩形框里找最大数,步进为2。 matlab实现方式如下:

        

     依次类推到最后一层,第六层。也就是文件里面的outx.txt的数据。

 

 

        

 

  最终结果,因为C中的截断 与matlab中默认的四舍五入 两种定点化方式不同导致结果数据大小有一点点不同。但是不影响最终结论。推断出也是数据4 。

   前面的铺垫如此了,后面的文章就是专门介绍 HDL 部分。

  

 

需要数据的请入QQ群:162664354

对于本文需要视频讲解的请到 B站:

https://www.bilibili.com/video/BV1Ca411b7qf/

需要看公众号的请到: FPGA攻城狮之家

posted on 2022-03-22 21:48  清霜一梦  阅读(549)  评论(0编辑  收藏  举报