当前位置: 首页 > news >正文

闲庭信步使用SV搭建图像测试平台:第三十一课——基于神经网络的手写数字识别

  (本系列只需要modelsim即可完成数字图像的处理,每个工程都搭建了全自动化的仿真环境,只需要双击文件就可以完成整个的仿真,大大降低了初学者的门槛!!!!如需要该系列的工程文件请关注知识星球:成工fpga,关注即送200GB学习资料,链接已置顶!)

本篇系列教程内容的最后一课,当然按照成工的习惯,还会有一篇结篇语,用来总结过去,展望未来。

最后一篇的内容,那我们就来实现一下大家比较感兴趣的神经网络,用神经网络来实现手写数字的识别,具体的原理成工就不讲了,大家可以关注一下B站上开源骚客的基于ZYNQ实现CNN手写数字识别。成工没有做模型的训练,直接用训练好的参数来实现CNN的模型。

一采用的CNN模型如下所示,各层的含义和数据量大家可以自行理解一下。成工想说的是,神经网络并不是多难,都是很成熟的,但是运算量很大,就是一直在进行乘加运算。比如Conv层有30个5x5的卷积核,而我们前面讲的插值,均值,增强,sobel等算子也不过都是1个3x3的算子,就算扩展到5x5,一个神经网络的Conv层的运算量至少增大30倍,因为Conv层的参数都是无规律的小数,并不像前面可以进行一些巧算。

手写数字都是28x28像素的,经过Conv层后去掉了两圈0(由于是模板是5x5,如果是3x3那就是去掉一圈零),图像大小变成了24x24,但是由于有30个卷积核,所以Conv层计算完毕后图像的大小是24x24x30。

激活Pelu层不改变图像节点数据的尺寸,激活函数很多,这个使用最简单的,数据小于0那就取0,大于0的数据不变。

Pooling层尺寸是2x2,步进是2,经过Pooling层后图像数据的大小是12x12x30=4320。

第一个全连接层Affine输出100个节点数据,也就是说Pooling层的4320个节点数据都要和这100个节点分别连接进行乘加运算,所以光参数量是需要4320*100=432000个。如果说Conv层的计算已经有些大了,全列举层的计算就是非常夸张了。不过这才是一个简单的手写数字识别的训练好的模型,现在动不动亿万参数的大模型,需要成百上千张GPU卡训练几个月,花费都在百万,千万甚至上亿级别的。

第二个全连接层Affine输出10个节点数据,那就是把上一层的100个节点和当前的10个节点全连接,需要的参数是100*10=1000个,这个计算量还可以。为什么最终是10个节点数据?因为数字是0-9共10个,所以10个输出就足够了。如果是识别猫的模型,输出两个节点就可以了,一个表示是猫,另一个表示不是猫。

成工写了CNN相关的功能模块,单独放在了img_cnn_pkt的包中,主要包括set_image_param,conv_2d,relu,pool_conv,full_connect,pool_full,predit_out,normalize等几个task。也不复杂,主要是要考虑数字的扩展和缩放,因为参数都是先放大后取的整数位。

网上有相关的数据集和测试集,这个成工也放在工程里面了,不过是jpg格式的,需要手动转换成bmp格式。

img文件夹多了一个文件夹,中src放置测试图片,dst存放结果的图片,parameter存放参数文件,show_img存放了0-9十张数字图片,当CNN识别的结果是几就将对应的图片存储到dst文件夹。

如下是参数文件夹下的文件,可见是全连接的w1参数最多。

如下是show_img文件夹下的图片。

仿真文件tb_image_sim如下,首先设置参数,从参数文件中读取相关的参数。因为图片都是黑白的,也就是RGB三通道数据都相同,所以直接取一个通道的数据进行CNN即可。101行是把图像上下翻转,因为模型训练是是采用的图片从左上到右下进行输入,而我们处理的bmp图片是从左下到右上进行输入,所以要先翻转。然后进行CNN的各步操作,最后得出预测的数据。109-110行保存了卷积和激活后的30张24x24的中间数据,可以很直接的看一下中间的结果。最后的113-118行就是实现了根据预测的数据将show_img文件夹下面的图片保存到dst文件夹。

假如我们对src文件夹下的test_590_3.bmp这种图片进行识别。

我们双击sim文件夹下的top_tb.bat文件,完成系统的自动化仿真。

仿真完毕后,可以看到modelsim有如下的打印信息,也就是说识别出来了数字3。

再看看img文件夹下的dst文件夹,除了将数字3的图片保存到改文件夹,还生成了卷积后的30张中间结果的图片。

当然模型的识别准确率也不是100%,比如模型就会把src中的test_18_3.bmp图片上的数据识别成8,当然准确率不是本文的重点,重点是模型的实现过程。

http://www.dtcms.com/a/267616.html

相关文章:

  • RS触发器Multisim电路仿真——硬件工程师笔记
  • 【unitrix】 4.18 类型级二进制数加法实现解析(add.rs)
  • .NET9 实现斐波那契数列(FibonacciSequence)性能测试
  • Windows内存泄漏自动化
  • 部署greenplum7.2双节点集群
  • Softhub软件下载站实战开发(十三):软件管理前端分片上传实现
  • 【部署与总结】从本地运行到公网服务器的全过程
  • Qt智能指针
  • 408第三季part2 - 计算机网络 - 计算机网络分层结构
  • Python数据分析基础04:预测性数据分析
  • 非负矩阵分解(NMF)的python应用 ,基因分析,以胰腺癌上皮亚簇为实例,NMF在癌症研究中的优势
  • 支持多方式拼接图片的软件
  • Zama 机密区块链协议Litepaper
  • RAL-2025 | 清华大学数字孪生驱动的机器人视觉导航!VR-Robo:面向视觉机器人导航与运动的现实-模拟-现实框架
  • 【ES6】Latex总结笔记生成器(网页版)
  • RocketMQ一键启动_window
  • 黑马点评系列问题之基础篇06初识redis测试连接redis失败
  • 硬件嵌入式工程师学习路线终极总结(二):Makefile用法及变量——你的项目“自动化指挥官”!
  • 深度学习5(深层神经网络 + 参数和超参数)
  • Ubuntu 20.04 编译安装FFmpeg及错误分析与解决方案
  • 数据结构:数组:插入操作(Insert)与删除操作(Delete)
  • PageRank:互联网的马尔可夫链平衡态
  • 利用已有的 PostgreSQL 和 ZooKeeper 服务,启动dolphinscheduler-standalone-server3.1.9 镜像
  • Redis基础(6):SpringDataRedis
  • Java创建型模式---工厂模式
  • java多线程--死锁
  • CppCon 2018 学习:Standard Library Compatibility Guidelines (SD-8)
  • 未成功,做个记录,SelfHost.HttpSelfHostServer 如何加载证书
  • 【Prometheus】Grafana、Alertmanager集成
  • 小架构step系列05:Springboot三种运行模式