文章目录
使用的环境:tf1.12,具体配置见here:

首先打开环境tf1.12,,再安装以下的包:
conda install opencv3-3.1.0-py36_0.tar.bz2
conda install matplotlib


conda install Pillow
conda install pandas

在download文件夹下打开终端,用下列命令下载原代码:
git clone https://github.com/suisuisi/FPGAandCNN.git

包括以下python脚本:
下载的是一个完整的工程文件夹,包括已经训练好的模型和已经转换过的权重信息,下面是尝试自己用脚本运行,得到结果。
在documents文件夹中,新建一个keras_mnist文件夹,将dataset和7个脚本复制到该空文件夹中,再建立一个空文件夹weights。

修改python3 r01_train_neural_net_and_prepare_initial_weights.py代码,将训练次数设置为50次(201行),每次训练200个batch_size(193行),学习率为0.001(182行):

输入以下命令运行该脚本(在tf1.12环境下):
python3 r01_train_neural_net_and_prepare_initial_weights.py
这个脚本的逻辑是,首先会展示一下model:

然后会判断数据集是否存在:

然后判断模型是否存在,不存在则重新开始训练:

然后就开始训练了…

训练结束后,使用mnist测试集进行测试,精确度达97.66;使用用户测试集对已训练好的网络进行测试,精确度可以达到80.39%;
这里先节约时间看看流程,所以设置epoch为5,可以看到精确度只达到了0.81,但是看到验证集的测试出错了:

根据报错,应该是函数调用的错误,在文件中找到该函数的定义与调用:


可见是函数调用时参数给多了一个,去掉最后一个参数’valid’即可。

修改该错误后重新运行脚本,就不报错了。可见在mnist测试集的精确度达到了0.94。

使用用户自己的测试集mnist_keras/dataset/test进行测试,精确度只有0.64:

在keras_mnist/weights文件夹下可以看到存储的权重信息,以及可视化训练精确度曲线图,橙色为训练曲线,蓝色为测试曲线:


这个精确度是不太好的,并且如果模型训练不好,之后权重分布很奇怪,导致权重位宽确定的时候会需要更多的bit数,需要的时间也很长,所以这里还是跑50个epoch吧!(耗时约40min)
可见,此时mnist测试集准确率达到0.97,用户测试集准确率达到0.87。


权重输出,即得到一个database.v文件,包含这么几个步骤:权重转换、权重位宽确定、写verilog文件。
首先,要运行r02_rescale_weights_to_use_fixed_point_representation.py脚本,进行权重转换。
什么是权重转换(转载):
在网络训练完成后,需要对网络训练后所得参数进行处理,浮点转定点与数据量化。在此,我们通过寻找合适的缩放系数进行定点转换,具体原理如下。
以神经网络的第一个卷积层为例子,在第一个卷积层输入处,输入是二维矩阵(原始图片)28*28,像素值的范围为[0:1]。对于3 * 3卷积,第二层中某个像素(i,j)的值可以如下计算:
由于使用软件已经训练出网络结构中的浮点型权重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个位置才能得到实数值。
如果我们对所有可能的输入图像进行排序并关注潜在的最小值和最大值,我们可以获得非常大的缩减系数,这样会在层与层之间降低计算精度。这样将需要很大的位宽和中间结果来表示定点结果。为了避免这种情况,我们只使用训练集的全部(或部分)来查找每层中最可能的最大值和最小值,然后进一步进行浮点定点转换。
因此,输入以下命令运行转换的脚本:
python3 r02_rescale_weights_to_use_fixed_point_representation.py
可见,他会首先搜索每层的最大值和最小值:

然后会根据找到的整体的最大最小值进行浮点转换,最后在keras_mnist/weights文件夹下将生成对应的权重文件keras_model_low_weights_digit_detector_rescaled.h5文件。


然后运行脚本r02_rescale_weights_to_use_fixed_point_representation.py:
在运行前排除一个坑,将1600行左右的创建文件夹的代码移动到main函数的最前面,然后修改os.mkdir()为os.makedirs()【因为创建的是多级目录】,如下图所示。(以免都跑了半天了才发现文件夹创建不成功…血的教训)

然后输入以下命令运行最后一个脚本:
python3 r05_verilog_generator_neural_net_structure.py
观察一下这个文件,首先会确定最佳的bit_size,这一步是调用的r03_find_optimal_bit_for_weights.py文件的函数,然后会找到之前保存的权重转换过的模型,然后使用大量的file.write()进行写verilog文件。



关于权重位宽的确定(转载):
对于具有有限宽度的权重和中间结果的定点计算,不可避免地会出现舍入误差,从一层到另一层累积,并且可能导致“不准确”的预测。为了验证预测的“准确性”,我们通过使用浮点型权重的神经网络对测试图像进行预测,以及使用定点型权重的神经网络对测试图像进行预测,将预测结果进行比较。
衡量的标准为:不匹配次数 / 总测试次数 * 100%。
因此,我们为找出合适的定点权重位宽,在脚本中将会从8bit量化位宽开始进行测试。测 试会计算该宽度的定点权重预测精度与浮点权重预测精度的误差。如果误差不为0,则增加位宽宽度,并继续执行测试,直到误差为0。
可以看到,会先按照8bit进行测试,error为7.84%,继续按照9bit测试:

9bit时,结果error为0,因此确定了我们权重位宽为9+1bit:

最后读取模型,生成以下files:


运行r04_verilog_generator_grayscale_file.py这个文件生成一个能加下“灰度转换”的verilog文件(其中会调用确定最佳位宽的函数,即在模型训练好后,要根据最终的模型确定灰度转换的代码)。
首先同样排掉这个坑,在文件main函数中添加创建文件夹的代码,或者自己先创建也行…

运行下列命令,可以生成灰度转换的verilog文件:
python3 r04_verilog_generator_grayscale_file.py
生成成功:


我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在