卷积神经网络目标定位(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图
通过查看卷积层的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
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!