经过了前面的开胃菜,项目正式开始。一步步讲解这个模型怎么玩起来的。从C 到 matlab 到 FPGA ,三个平台联合起来完成这个 由 RTL 实现 CNN 的项目。
第一步,讲解深度学习模型在C中是怎么实现的,也就是梳理数据流怎么运算的。
第二步,讲解这个数据怎么使用,如何去一步步验证自己的设计。
第三步,根据前面的理解,在FPGA中如何去设计自己的代码。
首先,C的源码前面的文章中已经公开了,第一步当然是理解深度学习模型在C中是怎么实现的。
这个深度学习的模型 LeNet5 实现的功能是 MNIST 数据识别。MNIST数据集是一个手写数字的图片集,然后被制作成里一个特殊的文件格式 —— 已经不是图片了,变成里这么一个东西:
网站上下载下来的是一个gz压缩文件,解压之后就是一个idx3-ubyte格式的文件。它包含了6w张用来做网络模型训练的图片,和1w张用来测试网络模型的图片。每张图片再搭配一个标签 —— 表明它是数据几。所以整个数据集就是 7w张图片 加 7w个标签。
不过你可以通过python轻松导出来,可以看到具体的图片和标签。解释这么多也够用了,有兴趣的朋友可以百度一下 MNIST ,比如下图,就是一个博主从数据集里扒出来的图。
先理解了数据集,再看看 C语言源码。第一步先分别导入训练数据集和标签,再导入里测试数据集和标签,然后开始 load 模型 —— 第一次运行模型为空,于是对模型进行初始化。细心一点往下看这个初始化过程会觉得很有特色 —— 刻意让数据很随机,让它们都不相同是有好处,具体什么好处可以去看看吴恩达的视频。(我看了,云里雾里的还是不懂,所以也解释不清楚)
后面就是训练和测试了,for是我后面添加的,可以让它训练很多次,提升精度。下面就是测试和打印,然后保存模型,释放空间。主程序完毕。
拿到开源代码,运行一下,结果就是这样子的
我就是在这个代码基础上,理解LeNet5的结构,然后量化。量化后再验证精度,然后导出模型,导出计算的中间数据。这个 C 代码就算物尽其用了。
有人觉得难懂?没关系,对于这个项目而言,我已经把C程序简化成了一张图,你可以忽略上述所有文字和程序,记住这张图就行。图的解释可以看QQ群中的文档,后面我还会详细讲解这张图的,以及图中用到的数据。
需要数据的请入QQ群:162664354
对于本文需要视频讲解的请到 B站:
https://www.bilibili.com/video/BV1Ca411b7qf/
需要看公众号的请到: FPGA攻城狮之家