文章目录
- FPGA实现mnist手写数字识别
-
- ① 环境配置
- ② 数据集及代码下载
- ③ 代码操作
-
- (1)训练模型
- (2)权重输出
- (3)关于灰度转换
FPGA实现mnist手写数字识别
① 环境配置
使用的环境:tf1.12,具体配置见here:
② 数据集及代码下载
在download文件夹下打开终端,用下列命令下载原代码:
修改python3 r01_train_neural_net_and_prepare_initial_weights.py代码,将训练次数设置为50次(201行),每次训练200个batch_size(193行),学习率为0.001(182行):
然后会判断数据集是否存在:
然后就开始训练了…
根据 错,应该是函数调用的错误,在文件中找到该函数的定义与调用:
可见是函数调用时参数给多了一个,去掉最后一个参数’valid’即可。
??由于使用软件已经训练出 络结构中的浮点型权重w (i,j),因此可以计算第二层输入的潜在最小mn和最大mx。设M = max(|mn|,|mx|),这样,我们将w(i,j)除以M的值,我们可以保证对于任意输入数据,第二层的输入都不会不超过1。我们称M为该层的缩放系数。对于第二层,我们使用相同的原理,即该层输出的值(第三层的输入)属于区间[-1;1] 。
??对于所有权重使用上述方法减小,最后一个神经元输出的最大位置是不会发生改变的,也就是说,转换后的权重信息等效于从浮点型权重所提供的信息。在经过缩减系数缩减后,可以确切的知道每个计算阶段输出值的大小范围,使用浮点定点转换算法,可以进一步实现浮点定点转换: x b = [ x ? 2 N ] xb= [x * 2N] xb=[x?2N],表示浮点数, x b xb xb表示定点数。
??也就是说:我们必须将转定点后的结果除以2N或者是将其移位N个位置才能得到实数值。
??如果我们对所有可能的输入图像进行排序并关注潜在的最小值和最大值,我们可以获得非常大的缩减系数,这样会在层与层之间降低计算精度。这样将需要很大的位宽和中间结果来表示定点结果。为了避免这种情况,我们只使用训练集的全部(或部分)来查找每层中最可能的最大值和最小值,然后进一步进行浮点定点转换。
因此,输入以下命令运行转换的脚本:
可见,他会首先搜索每层的最大值和最小值:
然后输入以下命令运行最后一个脚本:
观察一下这个文件,首先会确定最佳的bit_size,这一步是调用的r03_find_optimal_bit_for_weights.py文件的函数,然后会找到之前保存的权重转换过的模型,然后使用大量的file.write()进行写verilog文件。
9bit时,结果error为0,因此确定了我们权重位宽为9+1bit:
运行下列命令,可以生成灰度转换的verilog文件:
生成成功:
文章知识点与官方知识档案匹配,可进一步学习相关知识Python入门技能树首页概览212550 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!