FPGA实现mnist手写数字识别(软件部分)

这篇具有很好参考价值的文章主要介绍了FPGA实现mnist手写数字识别(软件部分)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

FPGA实现mnist手写数字识别

① 环境配置

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

FPGA实现mnist手写数字识别(软件部分)
首先打开环境tf1.12,,再安装以下的包:

  • opencv
    在这里下载“linux-64/opencv3-3.1.0-py36_0.tar.bz2”,通过共享文件夹copy到download文件夹中,在文件夹下打开终端,输入以下命令进行安装:
conda install opencv3-3.1.0-py36_0.tar.bz2
  • matplotlib(时刻注意是py36)
conda install matplotlib

FPGA实现mnist手写数字识别(软件部分)

FPGA实现mnist手写数字识别(软件部分)

  • Pillow(貌似不用了,上面已经安装过了)
conda install Pillow
  • Pandas
conda install pandas

FPGA实现mnist手写数字识别(软件部分)

② 数据集及代码下载

在download文件夹下打开终端,用下列命令下载原代码:

git clone https://github.com/suisuisi/FPGAandCNN.git

FPGA实现mnist手写数字识别(软件部分)

包括以下python脚本:

  • 常用图像处理函数定义以及工程所需要的基本函数:a00_common_functions.py,a02_generate_random_non_number.py
  • 网络模型构建:a01_model_low_weights_digit_detector.py
  • 网络训练与测试:r01_train_neural_net_and_prepare_initial_weights.py
  • 权重浮点转定点缩放系数计算,并压缩权重:r02_rescale_weights_to_use_fixed_point_representation.py
  • 定点权重位宽选择:r03_find_optimal_bit_for_weights.py
  • 生成对输入图像进行灰度转换的verilog代码:r04_verilog_generator_grayscale_file.py
  • 生成定点权重数据:r05_generator_database.py

③ 代码操作

下载的是一个完整的工程文件夹,包括已经训练好的模型和已经转换过的权重信息,下面是尝试自己用脚本运行,得到结果。

(1)训练模型

在documents文件夹中,新建一个keras_mnist文件夹,将dataset和7个脚本复制到该空文件夹中,再建立一个空文件夹weights。

FPGA实现mnist手写数字识别(软件部分)

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

FPGA实现mnist手写数字识别(软件部分)

输入以下命令运行该脚本(在tf1.12环境下):

python3 r01_train_neural_net_and_prepare_initial_weights.py

这个脚本的逻辑是,首先会展示一下model:

FPGA实现mnist手写数字识别(软件部分)

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

FPGA实现mnist手写数字识别(软件部分)

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

FPGA实现mnist手写数字识别(软件部分)

然后就开始训练了…

FPGA实现mnist手写数字识别(软件部分)

训练结束后,使用mnist测试集进行测试,精确度达97.66;使用用户测试集对已训练好的网络进行测试,精确度可以达到80.39%;

这里先节约时间看看流程,所以设置epoch为5,可以看到精确度只达到了0.81,但是看到验证集的测试出错了:

FPGA实现mnist手写数字识别(软件部分)

根据报错,应该是函数调用的错误,在文件中找到该函数的定义与调用:
FPGA实现mnist手写数字识别(软件部分)

FPGA实现mnist手写数字识别(软件部分)

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

FPGA实现mnist手写数字识别(软件部分)

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

FPGA实现mnist手写数字识别(软件部分)
使用用户自己的测试集mnist_keras/dataset/test进行测试,精确度只有0.64:

FPGA实现mnist手写数字识别(软件部分)

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

FPGA实现mnist手写数字识别(软件部分)

FPGA实现mnist手写数字识别(软件部分)

这个精确度是不太好的,并且如果模型训练不好,之后权重分布很奇怪,导致权重位宽确定的时候会需要更多的bit数,需要的时间也很长,所以这里还是跑50个epoch吧!(耗时约40min)

可见,此时mnist测试集准确率达到0.97,用户测试集准确率达到0.87。

FPGA实现mnist手写数字识别(软件部分)

FPGA实现mnist手写数字识别(软件部分)

(2)权重输出

权重输出,即得到一个database.v文件,包含这么几个步骤:权重转换、权重位宽确定、写verilog文件。

首先,要运行r02_rescale_weights_to_use_fixed_point_representation.py脚本,进行权重转换。

什么是权重转换(转载):

  在网络训练完成后,需要对网络训练后所得参数进行处理,浮点转定点与数据量化。在此,我们通过寻找合适的缩放系数进行定点转换,具体原理如下。
  以神经网络的第一个卷积层为例子,在第一个卷积层输入处,输入是二维矩阵(原始图片)28*28,像素值的范围为[0:1]。

  对于3 * 3卷积,第二层中某个像素(i,j)的值可以如下计算:

FPGA实现mnist手写数字识别(软件部分)

  由于使用软件已经训练出网络结构中的浮点型权重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=[x2N],表示浮点数, x b xb xb表示定点数。

  也就是说:我们必须将转定点后的结果除以2N或者是将其移位N个位置才能得到实数值。
  如果我们对所有可能的输入图像进行排序并关注潜在的最小值和最大值,我们可以获得非常大的缩减系数,这样会在层与层之间降低计算精度。这样将需要很大的位宽和中间结果来表示定点结果。为了避免这种情况,我们只使用训练集的全部(或部分)来查找每层中最可能的最大值和最小值,然后进一步进行浮点定点转换。

因此,输入以下命令运行转换的脚本:

python3 r02_rescale_weights_to_use_fixed_point_representation.py

可见,他会首先搜索每层的最大值和最小值:

FPGA实现mnist手写数字识别(软件部分)

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

FPGA实现mnist手写数字识别(软件部分)

FPGA实现mnist手写数字识别(软件部分)

然后运行脚本r02_rescale_weights_to_use_fixed_point_representation.py:

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

FPGA实现mnist手写数字识别(软件部分)

然后输入以下命令运行最后一个脚本:

python3 r05_verilog_generator_neural_net_structure.py

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

FPGA实现mnist手写数字识别(软件部分)FPGA实现mnist手写数字识别(软件部分)

FPGA实现mnist手写数字识别(软件部分)

关于权重位宽的确定(转载)

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

可以看到,会先按照8bit进行测试,error为7.84%,继续按照9bit测试:

FPGA实现mnist手写数字识别(软件部分)

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

FPGA实现mnist手写数字识别(软件部分)

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

FPGA实现mnist手写数字识别(软件部分)
FPGA实现mnist手写数字识别(软件部分)

(3)关于灰度转换

运行r04_verilog_generator_grayscale_file.py这个文件生成一个能加下“灰度转换”的verilog文件(其中会调用确定最佳位宽的函数,即在模型训练好后,要根据最终的模型确定灰度转换的代码)。

首先同样排掉这个坑,在文件main函数中添加创建文件夹的代码,或者自己先创建也行…

FPGA实现mnist手写数字识别(软件部分)

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

python3 r04_verilog_generator_grayscale_file.py

生成成功:
FPGA实现mnist手写数字识别(软件部分)
FPGA实现mnist手写数字识别(软件部分)文章来源地址https://www.toymoban.com/news/detail-414402.html

到了这里,关于FPGA实现mnist手写数字识别(软件部分)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • pytorch 入门 (三)案例一:mnist手写数字识别

    本文为🔗小白入门Pytorch内部限免文章 🍨 本文为🔗小白入门Pytorch中的学习记录博客 🍦 参考文章:【小白入门Pytorch】mnist手写数字识别 🍖 原作者:K同学啊 ​ 如果设备上支持GPU就使用GPU,否则使用CPU 使用dataset下载MNIST数据集,并划分好训练集与测试集 使用dataloader加载数

    2024年02月07日
    浏览(40)
  • 人工智能TensorFlow MNIST手写数字识别——实战篇

    上期文章TensorFlow手写数字-训练篇,我们训练了我们的神经网络,本期使用上次训练的模型,来识别手写数字(本期构建TensorFlow神经网络代码为上期文章分享代码) http://scs.ryerson.ca/~aharley/vis/conv/ 0、插入第三方库 1、图片处理函数

    2024年02月15日
    浏览(48)
  • 真的不能再详细了,2W字保姆级带你一步步用Pytorch搭建卷积神经网络实现MNIST手写数字识别

    目录 一、引言(环境)  二、正文 1. 代码基本情况介绍 2. MNIST数据集介绍         3. 代码输出结果介绍 数据集取样: 训练信息输出: 前三次训练成果以及预测: 八次训练的结果:  4. 代码拆解讲解 基本的参数设定 MNIST数据集下载、保存与加载 神经网络模型 训练前的准

    2023年04月20日
    浏览(32)
  • 从手写数字识别入门深度学习丨MNIST数据集详解

    就像无数人从敲下“Hello World”开始代码之旅一样,许多研究员从“MNIST数据集”开启了人工智能的探索之路。 MNIST数据集(Mixed National Institute of Standards and Technology database)是一个用来训练各种图像处理系统的二进制图像数据集,广泛应用于机器学习中的训练和测试。 作为一

    2024年02月03日
    浏览(36)
  • 【youcans动手学模型】LeNet 模型 MNIST 手写数字识别

    欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 本文用 PyTorch 实现 LeNet5 网络模型,使用 MNIST 数据集训练模型,进行手写数字识别。 Yann LeCun (2018年获得图灵奖)等在 1998 年发表论文“Gradient-Based Learning Applied to Document Recognition”,提出的 LeNet5 模型是

    2024年02月06日
    浏览(37)
  • TensorFlow进行MNIST数据集手写数字识别,保存模型并且进行外部手写图片测试

    首先,你已经配置好Anaconda3的环境,下载了TensorFlow模块,并且会使用jupyter了,那么接下来就是MNIST实验步骤。 数据集官网下载: MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges http://yann.lecun.com/exdb/mnist/   将上面四个全部下载,都是数据集,其中前两个是训练集,

    2024年02月08日
    浏览(34)
  • (神经网络)MNIST手写体数字识别MATLAB完整代码

            在此次实验中,笔者针对 MNIST 数据集,利用卷积神经网络进行训练与测试,提 出了一系列的改进方法,并对这些改进的方法进行了逐一验证,比较了改进方法与浅层 神经网络的优劣。         首先,笔者对实验中所用的 MNIST 数据集进行了简单的介绍;接着,

    2024年02月03日
    浏览(39)
  • [深度学习实战]基于PyTorch的深度学习实战(下)[Mnist手写数字图像识别]

    PyTorch——开源的Python机器学习库   首先感谢所有点开本文的朋友们!基于PyTorch的深度学习实战可能要告一段落了。本想着再写几篇关于 PyTorch神经网络深度学习 的文章来着,可无奈项目时间紧任务重,要求 短时间内出图并做好参数拟合 。所以只得转战 Matlab 编程,框架旧

    2024年02月16日
    浏览(44)
  • 【机器学习】VAE算法的pytorch实现-MNIST手写数据识别

    序言 承接上文 VAE变分自编码器学习笔记 一文介绍了VAE算法的设计思路、原理、公式推导以及作者本人对VAE模型的理解 这里继续就VAE算法的实现进行学习,为模型能够应用到工作中做准备 1. 环境配置 (1)我们使用pytorch来训练模型,首先导入必要的库(模块module、包package)

    2024年02月13日
    浏览(38)
  • 在树莓派上实现numpy的LSTM长短期记忆神经网络做图像分类,加载pytorch的模型参数,推理mnist手写数字识别

    这几天又在玩树莓派,先是搞了个物联网,又在尝试在树莓派上搞一些简单的神经网络,这次搞得是LSTM识别mnist手写数字识别 训练代码在电脑上,cpu就能训练,很快的: 然后需要自己在dataset里导出一些图片:我保存在了mnist_pi文件夹下,“_”后面的是标签,主要是在pc端导出

    2024年02月07日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包