在前篇文章中在HLS上完成了LeNet的编写,编写完lenet后,要确保网络的功能正确就需要仿真测试,在HLS上可以使用c语言仿真验证代码。
在验证之前,要在matlab上跑一遍正确的结果,以及把网络的权重转成.h头文件导入HLS工程文件夹下。选择使用matlab的原因是它用于数据处理非常的方便。也可以直接用python搭建这个lenet网络,并获得对应权重数据。
以上为卷积层仿真验证,其他层的验证以此类推。
在HLS上写好test_bench,接下来要将权重数据导入工程。打开matlab,将数据放到工作区,开始编写代码
代码如下
以上是将权重转为头文件的代码,这里需要注意一个问题,matlab读取权重数据是列优先的,而c语言读头文件是行优先的,所以对于二维的权重数据,要先将其转置再处理,四维权重数据要使用permute函数交换各维度,四维要将维度变为4321,即第一第四维度交换,第二第三维度交换,因为matlab当中是以个数、通道数、行、列来存四维权重数据的,我们要将其变为列、行、通道数、个数,这样通过头文件读取的权重才是正确的,当然这个问题只在使用matlab导出权重数据才需要考虑。
以上为将28x28图片转为头文件的代码,记得将数据转置后处理,测试图片可以打开电脑的画图软件自己画,只要是28x28的黑底白字图片即可,格式为bmp图片。
将导出的权重数据头文件和图片头文件放到与工程源文件,测试文件同一文件夹下。接下来就可以开始仿真,点击HLS中的Run C Simulation,即可开始仿真
仿真结果与matlab中对比无误,然后就可以继续对全连接层和整个lenet网络进行仿真测试。
下篇文章会对代码中的约束优化进行总结