位置: IT常识 - 正文

CNN卷积神经网络/手写数字识别[VHDL][MATLAB]带源码

编辑:rootadmin
CNN卷积神经网络/手写数字识别

推荐整理分享CNN卷积神经网络/手写数字识别[VHDL][MATLAB]带源码,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

 本次为期末课程设计,了解CNN过程,并且以数字识别为例去了解CNN的应用,采用matlab

来事先分析整个过程,并且转化为VHDL语言,使用FPGA使用该想法,由于本次为期末在家期间所做,没有硬件去验证准确性,只能利用波形仿真去验证思想。

目录

目录

 一、原理分析

1.1  输入数据性质

1.2 卷积层:

1.3  激活层

 1.4 池化层

1.5  全连接

 二、系统方案:

2.1 串入并出模块

 2.2  卷积层

2.3  激活层

2.4 池化层 

2.5 全连接层

三、代码分析 

  四、程序RTL图

五、波形仿真 

六、matlab分析过程


 一、原理分析1.1  输入数据性质

     输入层输入的图像一般包含R、G、B三个通道,是一个由长宽分别为H、W组成的三维像素值矩阵H×W×3。卷积网络会将输入层数据传递到一系列卷积、池化等操作进行特征提取和转化,最终由全连接层对特征进行汇总和输出。

    对于识别相关的图片我们需要总多性质,如下:

空间不变性:无论用哪种方法找到这个物体,都应该和物体的位置无关平移不变性:不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为平移不变性。局部性:神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。最终可以聚合这些局部特征,以在整个图像级别进行预测。

1.2 卷积层:

1)卷积层:

        卷积层(Convolution Layer)通常用于对输入数据进行特征提取,卷积原理其实就是对两张像素矩阵进行点乘求和的数学操作,求得的结果表示原始图像中提取的特定局部特征,于是规定不同的特征提取可以得到Feature Map从而来提取出输入中的特征,提取过程见图1.2.1所示。

       卷积就是一个滑动窗口在特征图上计算,比如以一个2*2的卷积核为例;卷积窗口从输入特征图的左上角开始,从左到右、从右到左的滑动,当卷积窗口滑动到新的位置时,将卷积核和特征图做对应元素相乘再相加,也就是说卷积核每滑动一次就计算得到一个标量值,当卷积核对特征图的滑动结束后就得到了卷积的结果;

   图1.2.1 二维卷积过程

2)步长:

      步长即卷积核遍历输入特征图时每步移动的像素数。如步长为1,则每次移动1个像素;步长为2,则每次移动2个像素(即跳过1个像素)。

3)填充:

       填充的存在就是应对卷积中出现越界的情况,比如44的特征矩阵,33的窗口滑动,步长为2,发现滑倒下一个窗口的时候就越界了,为了防止越界的情况出现,利用填充来弥补,并且为了能够得到边缘特征,填充能够帮助提取到边缘特征,从而更好的得到其结果,采用padding方式补0,其见图1.2.2所示。

 图1.2.2  Padding填充

1.3  激活层

       为了能够简化计算并且能够达到“分类的概率”,将小于0的数置0,对大于0的数保持,使用RELU函数,其激活函数处理结果可以清晰的看到如图1.2.3所示

图1.2.3  激活过程

 1.4 池化层

        当输入的数据量巨大的时候,卷积矩阵和卷积结果也会非常的庞大,这时候便需要利用池化将其进行压缩,常使用Max pool将得到新的Feature Map,舍去部分数据但是不改变其原主要特性,其池化过程见图1.2.4 所示。

 图1.2.4  Max pool池化过程

1.5  全连接

得到卷积提取的图片特征进行非线性学习,最后一层神经元个数对应分类的类别数。当然全连接和卷积层也可以互相转换,CNN最后以概率输出结果和实际的比较,其中对应不同的权重,其权重的设计需要大量的数据进行模型训练,这边设计到机器学习,其全连接见图1.2.5所示。 

 

 图1.2.5  全连接过程

      最终将卷积层、激活层、池化层、全连接层相组合便可以达到我们需要的CNN,并且由于视池化出的结果而言需要多个全连接模块,来对应不同概率,其概率最大则为最终输出结果,其过程见图1.2.6所示。  

图1.2.6 CNN卷积神经网络过程 

 二、系统方案:2.1 串入并出模块

        为了能够使得整个系统处理速率加快,使用串入并处模块,将数据串入输入,并出输出至卷积层,其结构见图2.1.1所示。

图2.1.1 串入并出模块

 2.2  卷积层

采用对角为1 1 1的矩阵和输入数据矩阵进行卷积,其 卷积框架见图2.1.2所示。

     图2.1.2   卷积层模块 

2.3  激活层

    激活层主要和0作比较并且通过数据选择器来构成,其框架见图2.1.3所示。 

 图2.1.3    激活层模块  

2.4 池化层 

       池化最主要的目的为压缩,利用2*2的采样矩形对原有矩形进行步长为1 的采样进行卷积得到池化结果,其结构见图2.1.4所示。

 图2.1.4    池化层模块  

2.5 全连接层

 为了能够对输入数据和实际进行判断,利用全连接,采样不同的全连接算子来输出不同的概率,4个全连接算子便输出4个结果,其过程见图2.1.5所示。

  图2.1.5    全连接层模块  

三、代码分析 

1)CNT9:由于为了加快数据的输入,同时输入3*3的矩阵进去,使用了寄存器串入并处的思想,那么需要使用计数器CNT9,0-8将数据串入到寄存器中,9的时候并出输入到卷积层进行卷积运算,其定时器代码部分如下。

2)SPIO:寄存器部分,为了使用串入并出的效果,同时输人3*3矩阵的九个数据,需要采用18个寄存器用来存储数据,,当CLK上升沿便送一个数据到寄存器,前面9个用来接受随时钟来的数据,后面9个寄存器获取前面9个寄存器的数据并且当CLK第9个上升沿时,输入到卷积层进行运算,其寄存器连接代码部分如下。

3)卷积层conv:3*3的矩阵数据经过串入并且传输到卷积层便开始进行卷积运算,首先确定其端口,有9个数据输入进来,数据宽度为8为,数字大小为0-256,通过卷积之后,由于是乘法运算2^8×2^8=2^16,于是输出结果为16位数据宽度,其输入的像素点为27*27通过卷积计算后输出3*3矩阵送入下一层,其定义端口说明如下。

输入3*3的矩阵进来后需要定义卷积和并与输入数据进行卷积,该处定义卷积核为 ,并且为了保持数据的准确性,数据宽度也为8位。,其定义代码如下所示。

为了完成卷积过程,调用乘法器和加法器的IP核,由于有9个数据输入,于是需要9个乘法器与之相乘,并且累加起来,累加方式有俩种,由于调用IP核中的加法器为俩输入一输出,并不能直接将9个数据进行相加,那么使用传统的相加思想使得加法器使用过多,本程序中使用折半的思想,将9个数据进行对半相加最终输出一个累加的结果。

4)池化层模块COMP:池化的目的是压缩数据,本程序中将卷积得到的3*3的数据矩阵压缩成2*2的数据矩阵,步长选择的1,通过调用COMP函数来达到该目的,其主要程序代码见下图。

5)激活模块JIHUO:为了使得将线性矩形变为非线性矩形,采用激活函数RELU函数,其主要将数据压缩至0-1之间,大于0的保持,小于0的置为0,其主要代码部分见下图。

6)全连接模块:全连接模块为设计权重,将经过卷积、激活、池化后的数据通过设计采样矩阵设计权重最终输出一个数字,则代表输出的概率,在数字识别系统则会输出与之对应匹配的数字,通过机器学习,模型训练可以使得权重最符合实际情况,概率最大则训练成功,其也代表卷积过程,只是权重不同。

 7)CNN顶层,为了能够提取边缘特征,对于数据进行补零操作,将输入的9个有效数据进行边缘补零为5*5矩阵,利用步长为1的卷积核进行卷积操作,其主要定义信号流线见下图所示。

  四、程序RTL图

1)串入并出 RTL图

串入并处主要使用寄存器将输入的数据由时钟送进去存储,当第九个时钟上升沿时,9个数据并行输入至卷积层,其RT图见图4.2.1所示。

图4.2.1  串入并RTL图 

2)卷积层RTL图

CNN卷积神经网络/手写数字识别[VHDL][MATLAB]带源码

通过查看卷积层的RTL图,可以得知将3*3的矩阵数据最终输出一个结果,其RTL图见图4.2.2所示。

图4.2.2  卷积层RTL图

3)激活层RTL图

通过查看激活层RTL图,可以了解到主要由一个比较器和数据选择器构成,大于0则输出本身,小于0则输出0,其RTL图见图4.2.3所示。

图4.2.3 激活层RTL图

4)池化层RTL图

池化主要目的为压缩,本程序所用2*2的矩阵,将3*3的矩阵通过步长为1 滑动来压缩至2*2,其中输出2*2矩阵中最大的一个作为特征值,其RTL图见图4.2.4所示。

图4.2.4 池化层RTL图

5)全连接层RTL图

全连接的功能为将2*2矩阵通过不同的权重来获得最终概率,其中用到卷积操作,其RTL图见图4.2.5所示。

图4.2.5 全连接层RTL图

6)整体CNN 网络RTL图

        本次程序采样最简单的,将数据串入并出至卷积层,经过激活,池化,全连接后输出即可,其RTL图见图4.2.6所示。

 图4.2.6 CNN整体RTL图

五、波形仿真 

       串入并出功能为前9个时钟上升沿时,输入数据至寄存器,待第10个上升沿同时将9个数据输出至卷积层,其波形仿真见图5.1所示。

图5.1 串入并出波形仿真 

         卷积层的作用为将3*3的矩阵和  卷积核进行卷积并且输出一个结果,通过查看卷积核性质可以得知,输出RESULT为输入数据的1、5、9个数据之和,通过分析波形仿真可以得知R_OUT1=38-38+75=75,符合、第二个数据R_OUT2=97+105+124=326,符合结果,其波形仿真见图5.2所示。

图5.2 卷积层波形仿真 

        激活层主要功能为将小于0的置为0,大于0的保持,通过波形可以看到符合,其波形仿真见图5.3所示。

图5.3 激活层波形仿真 

      池化层主要功能为压缩,将2*2的矩阵中输出最大值,通过分析图5.4所示,其输出结果均为四值中最大一值。

 图5.4  池化层波形仿真

全连接中权重矩阵为,和输入四个数据卷积,为四个数据之和,R_OUT1= -8384-9527-29522+4793=-42685符合功能要求,其波形仿真见图5.5所示。

 图5.5  全连接层波形仿真

        对于波形进行分析见图5.6,由于第一个数据-44在上升沿来到前便存在无法输送进去,于是输入进去的数据为55、-120、64、98、-118、1、2、-32、-101这九个数据,其计算见下图。

  图5.6  CNN波形仿真

CNN计算过程:

1、将数据进行补零组成5*5矩阵,与卷积核进行卷积得到3*3矩阵。

2、将卷积的结果通过激活,将大于0的保持,小于0的数置0 

 3、将激活后的矩阵通过池化取出最大值并压缩至2*2的矩阵

 4、将池化后的2*2矩阵通过取样矩阵单位为1,进行卷积操作,输出数据,符合仿真实际输出。

       若是需要不同的效率,如用不同的卷积核,利用不同的全连接,2层的效果等进行添加即可,例下图为采用不同的卷积核对数据进行卷积,可以得到三个不同的结果。

 

六、matlab分析过程

       为了能够更好的了解CNN的应用,利用MATLAB手写数字识别项目去了解CNN的整个过程,并且将相关思想使用VHDL语言编写。

在matlab中使用的俩层全连接,通过输出对应数字的概率来判断最终识别数字为多少,最大概率的那个为最终识别数字,并且为了能够不断精确识别精度,利用反向传播来不断修正权重,通过模型训练最终来使得权重最优化,其程序设计思想为图7.1和图7.2所示。

图7.1 CNN组成部分 

图7.2 matlab部分 

通过模型训练来进行迭代并且不断修正权重,最终达到最优化,见图7.3和图7.4所示。

图7.3  训练过程 

 图7.4 训练结果

参考资源:

https://mp.weixin.qq.com/s?__biz=Mzk0MzIzODM5MA==&mid=2247484654&idx=1&sn=0eefbc4c58ec17b6e657d67f0821d4e7&chksm=c337b977f4403061ae59d52eb3100f7cb94810be275aaf10ebdcf69ab911a8956b428338534c#rd

http://t.csdn.cn/U63b3

详解卷积神经网络(CNN)_liuhe_的博客-CSDN博客_卷积神经网络、

http://t.csdn.cn/veUbw

http://t.csdn.cn/zQZCS

卷积神经网络(CNN)详解 - 知乎

卷积神经网络CNN总结 - Madcola - 博客园

https://github.com/ShaoqingRen/faster_rcnn

https://github.com/HoniiTro19/MNIST

https://github.com/TianWanDiYiShuai/FPGA_test

本文链接地址:https://www.jiuchutong.com/zhishi/299177.html 转载请保留说明!

上一篇:vue3中hooks的介绍及用法(vue @hook)

下一篇:ElementUI快速上手(jar包本地下载)(element ui)

  • 苹果13怎么设置siri(苹果13怎么设置siri我在这呢)

    苹果13怎么设置siri(苹果13怎么设置siri我在这呢)

  • 小米10至尊纪念版使用的是什么处理器(小米10至尊纪念版和小米10s哪个好)

    小米10至尊纪念版使用的是什么处理器(小米10至尊纪念版和小米10s哪个好)

  • 手机qq资料卡怎么不显示空间照片(手机qq资料卡怎么不显示空间说说)

    手机qq资料卡怎么不显示空间照片(手机qq资料卡怎么不显示空间说说)

  • 手机打字繁体字怎么改回来(手机打字繁体字怎么调回去)

    手机打字繁体字怎么改回来(手机打字繁体字怎么调回去)

  • steam被盗了邮箱被改了怎么办(steam被盗了邮箱收不到验证码)

    steam被盗了邮箱被改了怎么办(steam被盗了邮箱收不到验证码)

  • 手机充值卡是不卖了吗(手机充值卡不记名实体卡能用吗)

    手机充值卡是不卖了吗(手机充值卡不记名实体卡能用吗)

  • 微信漏收消息原因(微信遗漏消息)

    微信漏收消息原因(微信遗漏消息)

  • 微信聊天语音转发播放不了(微信聊天语音转文字怎么操作)

    微信聊天语音转发播放不了(微信聊天语音转文字怎么操作)

  • 拼多多客户不确认收货什么时候到账(拼多多客户不确认收货物流异常率)

    拼多多客户不确认收货什么时候到账(拼多多客户不确认收货物流异常率)

  • oppo手机怎么设置陌生号码打不进来(oppo手机怎么设置电池电量显示)

    oppo手机怎么设置陌生号码打不进来(oppo手机怎么设置电池电量显示)

  • 快手可以图片评论吗(快手图片评论影视播放量吗)

    快手可以图片评论吗(快手图片评论影视播放量吗)

  • 为什么拼多多删除不了(为什么拼多多删了还能收到信息)

    为什么拼多多删除不了(为什么拼多多删了还能收到信息)

  • 百兆和千兆路由器区别(百兆和千兆路由器怎么区分)

    百兆和千兆路由器区别(百兆和千兆路由器怎么区分)

  • 抖音网络连接错误什么意思(抖音网络连接错误是什么原因)

    抖音网络连接错误什么意思(抖音网络连接错误是什么原因)

  • ps怎么改变图片大小(ps怎么改变图片像素)

    ps怎么改变图片大小(ps怎么改变图片像素)

  • 苹果11开关机在哪里(苹果11开机关机键是哪一个按钮)

    苹果11开关机在哪里(苹果11开机关机键是哪一个按钮)

  • 手机qq如何发送gif(手机QQ如何发送共享文档)

    手机qq如何发送gif(手机QQ如何发送共享文档)

  • 淘宝购物车怎么升级150(淘宝购物车怎么不让别人看到)

    淘宝购物车怎么升级150(淘宝购物车怎么不让别人看到)

  • 对方已关机是拉黑了吗(对方已关机是拉黑吗)

    对方已关机是拉黑了吗(对方已关机是拉黑吗)

  • 支付宝有夜间模式吗(支付宝有夜间模式)

    支付宝有夜间模式吗(支付宝有夜间模式)

  • 手机电池损耗多少更换(手机电池损耗多有危险吗)

    手机电池损耗多少更换(手机电池损耗多有危险吗)

  • 快手怎么拍作品(快手怎么拍作品上热门)

    快手怎么拍作品(快手怎么拍作品上热门)

  • 交了网费怎么恢复wifi(交完网费怎么重新登录)

    交了网费怎么恢复wifi(交完网费怎么重新登录)

  • 系统重装后怎么连不上网(系统重装后怎么恢复以前桌面文件)

    系统重装后怎么连不上网(系统重装后怎么恢复以前桌面文件)

  • 实现系统快速关机的设置方法(可以关闭系统的快捷键)

    实现系统快速关机的设置方法(可以关闭系统的快捷键)

  • 在Linux中安装是使用系统性能监控软件Nmon(linux安装方式有)

    在Linux中安装是使用系统性能监控软件Nmon(linux安装方式有)

  • 【前端】 Vscode 搭建基础开发环境(vscode怎么写前端代码)

    【前端】 Vscode 搭建基础开发环境(vscode怎么写前端代码)

  • python中upper函数的用法是什么?(python uppercase函数)

    python中upper函数的用法是什么?(python uppercase函数)

  • 印花税不足1元需要缴纳吗
  • 车船税每年都要交吗不交有什么影响
  • 支付租金对方公司提供发票如何入账
  • 超市小票能否入库
  • 对外投资固定资产的账务处理
  • 预期信用损失影响坏账准备吗
  • 购入免征车船税吗
  • 合同印花税申报表怎么填写
  • 品种法怎么计算在产品成本
  • 高速公路过路费计入什么会计科目
  • 承兑汇票承兑流程
  • 2017年个税税率表及个税计算公式
  • 不动产抵扣涉及净值,这里的净值是否扣除减值准备,是否扣除不动产改变用途当月的折旧额?
  • 医院行业类别怎样填写
  • 团队建设费用怎么入账
  • 外贸企业出口货物会计账务处理
  • 付工程款现金怎么做凭证?
  • 如何分析财务报表看企业经营情况
  • 一般纳税人劳务发票税点多少
  • 股东分红的会计科目怎么做
  • PHP:apache_get_modules()的用法_Apache函数
  • NJeeves.exe - NJeeves进程文件是什么意思 有什么用
  • 股票发行费用怎么算
  • 国外进口增值税税率
  • 企业发生的与日常经营活动无直接关系的各项利得
  • php封包
  • Laravel 5.4因特殊字段太长导致migrations报错的解决
  • php imagefill
  • php获取表单数据保存到mysql中
  • /etc/php-fpm.d/www.conf 配置注意事项
  • vue动态组件component原理
  • css spirit
  • c++图像二值化
  • diff命令参数
  • 利息收入的会计科目怎么做
  • 购销合同印花税税率
  • 个体工商户建账办法最新
  • 发票开具的常见错误以及盖章问题
  • 没授权的帝国cms作为商用行吗
  • 待报解预算收入怎么做账
  • 数据库维护工作主要包括哪些内容
  • sqlserver2008数据库可疑
  • 政府收购企业的流程
  • 收到以前年度退回的企业所得税怎么做账
  • 企业增值税包含哪些税项及税率
  • 个人扣税是怎么扣的
  • 小规模差额征税的账务处理
  • 外币资产汇兑损失计算公式
  • 红冲暂估原材料如何做会计分录
  • 权益净利率计算公式产权比率
  • 公司按揭贷款
  • 小规模纳税人租赁发票税率是多少
  • 长期挂账的其他应付款税务风险
  • 独立核算和非独立核算哪个好
  • 聘用残疾人优惠政策
  • 支票丢失需要登报吗
  • 开始建账需要哪些数据
  • centos rpcbind
  • mac安装surge
  • win10怎么用xp经典主题
  • 右键菜单管理 win10
  • freebsd 安装
  • win8安装win10驱动
  • win10控制面板中没有防火墙
  • windows102021年更新
  • win8系统开机桌面文件不见了
  • win7开始菜单没有搜索框
  • unity 读取xml文件
  • 简单谈谈你的入党动机
  • python下三角
  • nodejs全局异常监听
  • linux中mysql备份shell脚本代码
  • 常用的批处理文件
  • 批处理文件如何运行
  • nodejs操作mysql数据库
  • unity2018预制体
  • vue卡片式风格
  • 浙江省国税电子税务局如何新增企业
  • 国税总局编制这次怎么调整
  • 公司如何制定制度
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设