精华内容
下载资源
问答
  • 深度学习 CNN卷积神经网络 LeNet-5详解

    万次阅读 多人点赞 2017-10-18 16:04:35
    是一种常见的深度学习架构,受生物自然视觉认知机制(动物视觉皮层细胞负责检测光学信号)启发而来,是一种特殊的多层前馈神经网络。它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现...

    文章首发于公众号【编程求职指南】
    卷积神经网络( Convolutional Neural Network, CNN):
    是一种常见的深度学习架构,受生物自然视觉认知机制(动物视觉皮层细胞负责检测光学信号)启发而来,是一种特殊的多层前馈神经网络。它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。
    一般神经网络VS卷积神经网络:
    相同点:卷积神经网络也使用一种反向传播算法(BP)来进行训练
    不同点:网络结构不同。卷积神经网络的网络连接具有局部连接、参数共享的特点。
    局部连接:是相对于普通神经网络的全连接而言的,是指这一层的某个节点只与上一层的部分节点相连。
    参数共享:是指一层中多个节点的连接共享相同的一组参数。
    这里写图片描述
    全连接:连接个数nm 局部连接:连接个数im
    参数不共享:参数个数n*m+m 参数共享:参数个数i+1

    卷积神经网络的主要组成:
    卷积层(Convolutional layer),卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。

    池化层(Pooling),它实际上一种形式的向下采样。有多种不同形式的非线性池化函数,而其中最大池化(Max pooling)和平均采样是最为常见的

    全连接层(Full connection), 与普通神经网络一样的连接方式,一般都在最后几层

    pooling层的作用:
    Pooling层相当于把一张分辨率较高的图片转化为分辨率较低的图片;
    pooling层可进一步缩小最后全连接层中节点的个数,从而达到减少整个神经网络中参数的目的。

    LeNet-5卷积神经网络模型
    LeNet-5:是Yann LeCun在1998年设计的用于手写数字识别的卷积神经网络,当年美国大多数银行就是用它来识别支票上面的手写数字的,它是早期卷积神经网络中最有代表性的实验系统之一。

    LenNet-5共有7层(不包括输入层),每层都包含不同数量的训练参数,如下图所示。
    这里写图片描述
    LeNet-5中主要有2个卷积层、2个下抽样层(池化层)、3个全连接层3种连接方式

    卷积层
    卷积层采用的都是5x5大小的卷积核/过滤器(kernel/filter),且卷积核每次滑动一个像素(stride=1),一个特征图谱使用同一个卷积核.
    每个上层节点的值乘以连接上的参数,把这些乘积及一个偏置参数相加得到一个和,把该和输入激活函数,激活函数的输出即是下一层节点的值
    这里写图片描述

    LeNet-5的下采样层(pooling层)
    下抽样层采用的是2x2的输入域,即上一层的4个节点作为下一层1个节点的输入,且输入域不重叠,即每次滑动2个像素,下抽样节点的结构如下:
    这里写图片描述
    每个下抽样节点的4个输入节点求和后取平均(平均池化),均值乘以一个参数加上一个偏置参数作为激活函数的输入,激活函数的输出即是下一层节点的值。

    卷积后输出层矩阵宽度的计算:
    Outlength=
    (inlength-fileterlength+2*padding)/stridelength+1

    Outlength:输出层矩阵的宽度
    Inlength:输入层矩阵的宽度
    Padding:补0的圈数(非必要)
    Stridelength:步长,即过滤器每隔几步计算一次结果

    LeNet-5第一层:卷积层C1
    C1层是卷积层,形成6个特征图谱。卷积的输入区域大小是5x5,每个特征图谱内参数共享,即每个特征图谱内只使用一个共同卷积核,卷积核有5x5个连接参数加上1个偏置共26个参数。卷积区域每次滑动一个像素,这样卷积层形成的每个特征图谱大小是(32-5)/1+1=28x28。C1层共有26x6=156个训练参数,有(5x5+1)x28x28x6=122304个连接。C1层的连接结构如下所示。
    这里写图片描述

    LeNet-5第二层:池化层S2
    S2层是一个下采样层(为什么是下采样?利用图像局部相关性的原理,对图像进行子抽样,可以减少数据处理量同时保留有用信息)。C1层的6个28x28的特征图谱分别进行以2x2为单位的下抽样得到6个14x14((28-2)/2+1)的图。每个特征图谱使用一个下抽样核。5x14x14x6=5880个连接。S2层的网络连接结构如下右图
    这里写图片描述

    LeNet-5第三层:卷积层C3
    C3层是一个卷积层,卷积和和C1相同,不同的是C3的每个节点与S2中的多个图相连。C3层有16个10x10(14-5+1)的图,每个图与S2层的连接的方式如下表 所示。C3与S2中前3个图相连的卷积结构见下图.这种不对称的组合连接的方式有利于提取多种组合特征。该层有(5x5x3+1)x6 + (5x5x4 + 1) x 3 + (5x5x4 +1)x6 + (5x5x6+1)x1 = 1516个训练参数,共有1516x10x10=151600个连接。
    这里写图片描述

    LeNet-5第四层:池化层S4
    S4是一个下采样层。C3层的16个10x10的图分别进行以2x2为单位的下抽样得到16个5x5的图。5x5x5x16=2000个连接。连接的方式与S2层类似,如下所示。
    这里写图片描述

    LeNet-5第五层:全连接层C5
    C5层是一个全连接层。由于S4层的16个图的大小为5x5,与卷积核的大小相同,所以卷积后形成的图的大小为1x1。这里形成120个卷积结果。每个都与上一层的16个图相连。所以共有(5x5x16+1)x120 = 48120个参数,同样有48120个连接。C5层的网络结构如下所示。
    这里写图片描述

    LeNet-5第六层:全连接层F6
    F6层是全连接层。F6层有84个节点,对应于一个7x12的比特图,该层的训练参数和连接数都是(120 + 1)x84=10164.
    这里写图片描述

    LeNet-5第七层:全连接层Output
    Output层也是全连接层,共有10个节点,分别代表数字0到9,如果节点i的输出值为0,则网络识别的结果是数字i。采用的是径向基函数(RBF)的网络连接方式。假设x是上一层的输入,y是RBF的输出,则RBF输出的计算方式是:
    这里写图片描述
    yi的值由i的比特图编码(即参数Wij)确定。yi越接近于0,则标明输入越接近于i的比特图编码,表示当前网络输入的识别结果是字符i。该层有84x10=840个设定的参数和连接。连接的方式如上图.

    以上是LeNet-5的卷积神经网络的完整结构,共约有60,840个训练参数,340,908个连接。一个数字识别的效果如图所示

    这里写图片描述

    LeNet-5的训练算法
    训练算法与传统的BP算法差不多。主要包括4步,这4步被分为两个阶段:
    第一阶段,向前传播阶段:
    a)从样本集中取一个样本(X,Yp),将X输入网络;
    b)计算相应的实际输出Op。
    在此阶段,信息从输入层经过逐级的变换,传送到输出 层。这个过程也是网络在完成训练后正常运行时执行的过程。在此过程中,网络执行的是计算(实际上就是输入与每层的权值矩阵相点乘,得到最后的输出结果):
    Op=Fn(…(F2(F1(XpW(1))W(2))…)W(n))
    第二阶段,向后传播阶段
    a)算实际输出Op与相应的理想输出Yp的差;
    b)按极小化误差的方法反向传播调整权矩阵。

    卷积神经网络的优点
    卷积网络较一般神经网络在图像处理方面有 如下优点
    a)输入图像和网络的拓扑结构能很好的吻
    合;
    b)特征提取和模式分类同时进行,并同时在
    训练中产生;
    c)权重共享可以减少网络的训练参数,使神
    经网络结构变得更简单,适应性更强。
    总结
    卷积网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式。

    通过对LeNet-5的网络结构的分析,可以直观地了解一个卷积神经网络的构建方法,可以为分析、构建更复杂、更多层的卷积神经网络做准备。

    LaNet-5的局限性
    CNN能够得出原始图像的有效表征,这使得CNN能够直接从原始像素中,经过极少的预处理,识别视觉上面的规律。然而,由于当时缺乏大规模训练数据,计算机的计算能力也跟不上,LeNet-5 对于复杂问题的处理结果并不理想。

    2006年起,人们设计了很多方法,想要克服难以训练深度CNN的困难。其中,最著名的是 Krizhevsky et al.提出了一个经典的CNN 结构,并在图像识别任务上取得了重大突破。其方法的整体框架叫做 AlexNet,与 LeNet-5 类似,但要更加深一些。

    展开全文
  • 深度学习CNN代码

    热门讨论 2014-04-09 22:07:57
    深度学习CNN代码,帮助理解卷积网络,代码是可以运行的,没有问题
  • 深度学习CNN算法原理

    万次阅读 多人点赞 2018-11-13 18:32:12
    深度学习CNN算法原理 一 卷积神经网络 卷积神经网络(CNN)是一种前馈神经网络,通常包含数据输入层、卷积计算层、ReLU激活层、池化层、全连接层(INPUT-CONV-RELU-POOL-FC),是由卷积运算来代替传统矩阵乘法运算...

    深度学习CNN算法原理

    一 卷积神经网络

    卷积神经网络(CNN)是一种前馈神经网络,通常包含数据输入层、卷积计算层、ReLU激活层、池化层、全连接层(INPUT-CONV-RELU-POOL-FC),是由卷积运算来代替传统矩阵乘法运算的神经网络。CNN常用于图像的数据处理,常用的LenNet-5神经网络模型如下图所示:

     

           该模型由2个卷积层、2个抽样层(池化层)、3个全连接层组成。

    1.1 卷积层

           用途:进行特征提取

    https://images2015.cnblogs.com/blog/1062917/201611/1062917-20161117195004607-577964604.png

           如上图所示:若输入图像是32*32*3(3是它的深度(即R、G、B),卷积层是一个5*5*3的filter(感受野)。注意感受野的深度必须和输入图像的深度相同。通过一个filter与输入图像的卷积可以得到一个28*28*1的特征图,上图是用了两个filter得到了两个特征图;在实际的运用过程中,通常会使用多层卷积层来得到更深层次的特征图。

           卷积层是通过一个可调参数的卷积核与上一层特征图进行滑动卷积运算,再加上一个偏置量得到一个净输出,然后调用激活函数得出卷积结果,通过对全图的滑动卷积运算输出新的特征图,

    ujl=i∈Mixijl-1*kijl+bjl

    xjl=f(ujl)

           式中xijl-1l-1层特征图被第j个卷积所覆盖的元素;kijll层卷积核中的元素;bjl为第j个卷积结果的偏置量;Mi为第i个卷积核所覆盖的区域;ujll层卷积的净输入;fujl为激活函数;xjll层第j个卷积的输入。

    https://images2015.cnblogs.com/blog/1062917/201611/1062917-20161117195503451-270982131.png

    如图中所示,filter w0的第一层深度和输入图像的蓝色方框中对应元素相乘再求和得到0,其他两个深度得到20,则有0+2+0+1=3即图中右边特征图的第一个元素3.,卷积过后输入图像的蓝色方框再滑动,stride=2,如下图。

    https://images2015.cnblogs.com/blog/1062917/201611/1062917-20161117200000888-1689372810.png

           卷积层还有一个特性就是权值共享原则。如没有这个原则,则特征图由1032*32*1的特征图组成,即每个特征图上有1024个神经元,每个神经元对应输入图像上一块5*5*3的区域,即一个神经元和输入图像的这块区域有75个连接,即75个权值参数,则共有75*1024*10=768000个权值参数,这是非常复杂的,因此卷积神经网络引入权值共享原则,即一个特征图上每个神经元对应的75个权值参数被每个神经元共享,这样则只需75*10=750个权值参数,而每个特征图的阈值也共享,即需要10个阈值,则总共需要750+10=760个参数。

     

    补充:

           (1)对于多通道图像做1*1卷积,其实就是将输入图像的每个通道乘以系数后加在一起,即相当于将原图中本来各个独立的通道“联通”在了一起;

           (2)权值共享时,只是在每一个filter上的每一个channel中是共享的;

    1.2 抽样层(池化层)

           抽样层是将输入的特征图用nxn的窗口划分成多个不重叠的区域,然后对每个区域计算出最大值或者均值,使图像缩小了n倍,最后加上偏置量通过激活函数得到抽样数据。

           用途:对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征。

    https://images2015.cnblogs.com/blog/1062917/201611/1062917-20161117211920029-1784506227.png

           池化操作一般有两种,一种是Avy Pooling,一种是max Pooling,如下:

    https://images2015.cnblogs.com/blog/1062917/201611/1062917-20161117212026498-272435652.png

           同样地采用一个2*2filter,max pooling是在每一个区域中寻找最大值,这里的stride=2,最终在原特征图中提取主要特征得到右图。

           Avy pooling现在不怎么用了(其实就是平均池化层),方法是对每一个2*2的区域元素求和,再除以4,得到主要特征),而一般的filter2*2,最大取3*3,stride2,压缩为原来的1/4.

           注意:这里的pooling操作是特征图缩小,有可能影响网络的准确度,因此可以通过增加特征图的深度来弥补(这里的深度变为原来的2倍)。

    1.3 全连接输出层

    全连接层则是通过提取的特征参数对原始图像进行分类。常用的分类方法如下式

    yl=f(wlxl-1+bl)

    式中xl-1为前一层的特征图,通过卷积核抽样提取出来的特征参数;wl为全连接层的权重系数;bll层的偏置量。

    用途:连接所有的特征,将输出值送给分类器(如softmax分类器)。

    1.4 总结

    CNN网络中前几层的卷积层参数量占比小,计算量占比大;而后面的全连接层正好相反,大部分CNN网络都具有这个特点。因此我们在进行计算加速优化时,重点放在卷积层;进行参数优化、权值裁剪时,重点放在全连接层。

    二 Backpropagation Pass反向传播

             反向传播回来的误差可以看做是每个神经元的基的灵敏度sensitivities(灵敏度的意思就是我们的基b变化多少,误差会变化多少,也就是误差对基的变化率,也就是导数了),定义如下:(第二个等号是根据求导的链式法则得到的)

    https://img-blog.csdn.net/20130816002850203?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem91eHkwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

             因为∂u/∂b=1,所以∂E/∂b=∂E/∂u=δ,也就是说bias基的灵敏度∂E/∂b=δ和误差E对一个节点全部输入u的导数∂E/∂u是相等的。这个导数就是让高层误差反向传播到底层的神来之笔。反向传播就是用下面这条关系式:(下面这条式子表达的就是第l层的灵敏度,就是)

    https://img-blog.csdn.net/20130816002937765?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem91eHkwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast公式(1

             这里的“◦”表示每个元素相乘。输出层的神经元的灵敏度是不一样的:

    https://img-blog.csdn.net/20130816002950875?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem91eHkwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

             最后,对每个神经元运用delta(即δ)规则进行权值更新。具体来说就是,对一个给定的神经元,得到它的输入,然后用这个神经元的delta(即δ)来进行缩放。用向量的形式表述就是,对于第l层,误差对于该层每一个权值(组合为矩阵)的导数是该层的输入(等于上一层的输出)与该层的灵敏度(该层每个神经元的δ组合成一个向量的形式)的叉乘。然后得到的偏导数乘以一个负学习率就是该层的神经元的权值的更新了:

    https://img-blog.csdn.net/20130816003002437?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem91eHkwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast公式(2

             对于bias基的更新表达式差不多。实际上,对于每一个权值(W)ij都有一个特定的学习率ηIj。

     

    三 Computing the Gradients梯度计算

           假定每个卷积层l都会接一个下采样层l+1 。对于BP来说,我们知道,要想求得层l的每个神经元对应的权值的权值更新,就需要先求层l的每一个神经节点的灵敏度δ(也就是权值更新的公式(2))。为了求这个灵敏度我们就需要先对下一层的节点(连接到当前层l的感兴趣节点的第l+1层的节点)的灵敏度求和(得到δl+1),然后乘以这些连接对应的权值(连接第l层感兴趣节点和第l+1层节点的权值)W。再乘以当前层l的该神经元节点的输入u的激活函数f的导数值(也就是那个灵敏度反向传播的公式(1)的δl的求解),这样就可以得到当前层l每个神经节点对应的灵敏度δl了。

           因为下采样的存在,采样层的一个像素(神经元节点)对应的灵敏度δ对应于卷积层(上一层)的输出map的一块像素(采样窗口大小)。因此,层l中的一个map的每个节点只与l+1层中相应map的一个节点连接。

         为了有效计算层l的灵敏度,我们需要上采样upsample 这个下采样downsample层对应的灵敏度map(特征map中每个像素对应一个灵敏度,所以也组成一个map),这样才使得这个灵敏度map大小与卷积层的map大小一致,然后再将层lmap的激活值的偏导数与从第l+1层的上采样得到的灵敏度map逐元素相乘(也就是公式(1))。

           下采样层map的权值都取一个相同值β,而且是一个常数。所以我们只需要将上一个步骤得到的结果乘以一个β就可以完成第l层灵敏度δ的计算

           参考网址:https://blog.csdn.net/u010555688/article/details/38780767

    二 实验分析

           在本文中,实验结果和过程基于Tensorflow深度学习框架进行实现,数据源使用MNIST数据集,分别采用softmax回归算法和CNN深度学习进行模型训练。

    2.1 CNN模型实现

    结合LenNet-5神经网络模型,基于Tensorflow深度学习模型实现方式如下:

    2.2 模型评价指标

           采用常用的成本函数“交叉熵”,如下式所示:

    Hy'y=-iyi'log⁡(yi)

           式中,y为预测的概率分布,y’为实际输入值。实现方法如下:(1)创建占位符输入正确值;(2)计算交叉熵

    2.3 模型检验

           预测结果检验方法:

     

    展开全文
  • 基于FPGA的深度学习CNN加速器设计 英文原文: http://cadlab.cs.ucla.edu/~cong/slides/fpga2015_chen.pdf?spm=a2c4e.11153940.blogcont5752.3.654031b6l0wvY2&file=fpga2015_chen.pdf ...

    基于FPGA的深度学习CNN加速器设计

    英文原文:

    http://cadlab.cs.ucla.edu/~cong/slides/fpga2015_chen.pdf?spm=a2c4e.11153940.blogcont5752.3.654031b6l0wvY2&file=fpga2015_chen.pdf

    https://yq.aliyun.com/articles/5752

    因为CNN的特有计算模式,通用处理器对于CNN实现效率并不高,不能满足性能要求。 因此,近来已经提出了基于FPGA,GPU甚至ASIC设计的各种加速器来提高CNN设计的性能。 在这些方法中,基于FPGA的加速器引起了研究人员越来越多的关注,因为它们具有性能好,能源效率高,开发周期快,重构能力强等优点。

    在实验中,研究人员发现在FPGA相同的逻辑资源利用率情况下,两种不同解决方案可能会有多达90%的性能差异。所以找出最佳解决方案是很重要的,特别是当考虑到FPGA平台的计算资源和存储器带宽的限制时。 实际上,如果加速器结构没有精心设计,其计算吞吐量与提供FPGA平台的内存带宽不匹配。 这意味着由于逻辑资源或存储器带宽的利用不足将造成性能的降级。

    不幸的是,FPGA技术和深度学习算法的进步同时加剧了这个问题。 一方面,由最先进的FPGA平台提供的日益增加的逻辑资源和存储器带宽扩大了设计空间。 此外,当应用各种FPGA优化技术(如循环平铺和变换)时,设计空间进一步扩大。 另一方面,为了适应现代应用的需求,深度学习算法的规模和复杂性也在不断增加。所以,在设计空间中找出最优解是比较困难的。 因此,迫切需要有效的方法来探索基于FPGA的CNN设计空间。

    然而现有的大部分工作主要关注计算引擎优化,它们有的忽略外部存储器操作,有的将其加速器直接连接到外部存储器。还有些研究工作通过精细的数据重用减少外部数据访问来加速CNN应用。然而,这种方法并不一定会导致最佳的整体性能。此外,这种方法需要重新配置不同层次的FPGA计算。这在某些情况下是不可行的。

    因此,为了有效地探索设计空间,有研究人员提出了一种分析设计方案。这种方案考虑到缓冲区管理和带宽优化,以更好地利用FPGA资源并实现更高的性能。同时加速器能够跨越不同的层执行加速作业,而无需重新编程FPGA。下面我们具体来看一下这种方案。

    考虑到在应用中基本都是将训练好的CNN模型部署到现有计算平台上进行预测操作,所以,很多的FPGA加速方案中仅考虑优化前向操作。同时又有研究表明,卷积操作占据了CNN模型将近90%的计算时间,所以,本方案也是仅考虑优化CNN模型前向计算中的卷积运算,优化的模型选择为经典的AlexNet。同时为了更好的分析网络的性能,研究人员借助Roofline Model进行优化方案的设计。通过这个 model,既可以评估一个设计的效率,还能很容易看出设计到底是 computation-limited 还是 memory bandwidth-limited,可以帮助确定进一步优化的思路。

    首先,我们先来了解一下CNN中的卷积运算的规则,CNN中的卷积运算如图1所示,代码1表示其伪代码。

    图1

    代码1

    几乎所有的基于FPGA的加速方案,都如图2显示的那样,FPGA上的CNN加速器设计主要由处理元件(PE),片上缓冲器,外部存储器和片上/片外互连几个组件组成。其中PE是卷积的基本计算单元。用于处理的所有数据都存储在外部存储器中。由于片上资源限制,数据首先被缓存在片上缓冲区中,然后再馈送给PE。双缓冲区用于通过数据传输时间来覆盖计算时间。片内互连专用于PE和片上缓冲存储器之间的数据通信。

    图2

    通过观察图2,我们可以发现有几个设计问题妨碍了FPGA平台上高效的CNN加速器设计。首先,为了适应芯片上的一小部分数据,循环平铺是必须的。不正确的平铺可能会降低数据重用的效率和数据处理的并行性。第二,应仔细考虑PE和缓冲库的组织以及它们之间的互连,以便有效地处理片上数据。第三,PE的数据处理吞吐量应与FPGA平台提供的片外带宽匹配。

    为了解决上述问题,下面逐条分解实现方案。

    1)首先,方案采用循环平铺(代码2)。注意,循环迭代器i和j由于CNN中卷积窗口大小K的相对小的尺寸(通常在3到11之间)而不是平铺的。其他循环迭代器(row,col,to和ti)平铺到图形循环和点循环中(代码2中的trr,tcc和tii)。

    代码2

    2)片上计算优化的实现

    计算优化的目的是在充分利用FPGA硬件平台提供的所有计算资源的同时,实现高效的循环展开/流水线化。

    循环展开可用于增加FPGA设备中大规模计算资源的利用率。在给定阵列上循环维度的不同循环迭代之间的数据共享关系可分为三类:不相干,独立,有依赖关系。对应如图3所示。如代码2所示,CNN代码中的数据共享关系如表1所示。

    图3

    表1

    因此在设计展开时,选择对too和tii进行展开,以避免所有阵列的复杂连接拓扑。too和tii被置换到最内层循环,以简化HLS代码生成。生成的硬件实现如图4所示。

    图4

    循环流水线化是高级合成中的关键优化技术,通过重复来自不同循环迭代的操作的执行来提高系统吞吐量。因此方案使用基于多面体的优化框架来执行自动循环变换以将并行循环水平置换到最内层,以避免循环依赖。

    最终循环展开和循环流水线优化后的代码结构如代码3所示。

    代码3

    3)内存访问优化的实现

    代码4展示了一个CNN层的存储器传送操作。输入/输出特征图和权重在计算引擎启动之前就已被加载,计算完成后,将生成的输出特征图写回主存储器。

    代码4

    通过分析可知,通信部分中的最内层循环(代码4中的ti)与数组无关,因此在不同的循环迭代之间存在冗余的存储器操作。所以方案使用本地存储提升来减少相关冗余操作。代码4中,最内圈的维数ti与阵列输出特征图无关。因此,可以将对阵列输出特征图的访问提升到外部循环。请注意,升级过程可以迭代执行,直到访问周围的最内层循环最终相关。通过本地存储提升,阵列输出特征图上的存储访问操作的行程计数从降到了 。

    循环转换数据重用。为了通过本地存储提升最大化数据重用的机会,方案使用基于多面体的优化框架来识别所有合法的循环转换。表2显示了循环迭代和数组之间的数据共享关系。每个合法循环调度中都会使用本地存储提升功能,以减少总通信量。

    表2

    通过上述操作,方案明显提升了CTC Ratio。

    4)设计空间探索

    以CNN模型的第5层为例,图5描绘了CNN模型的第5层在rooline模型坐标系中的所有合理的解决方案。横轴表示CCT Ratio,纵轴表示计算性能(GFLOPS)。任何点与原点(0,0)之间的线的斜率表示该实现的最小带宽要求。

    图5

    图6中,带宽Roof和计算Roof的线由平台的规格定义。带宽Roof线的左侧的任何一点都需要比平台提供的带宽更高的带宽。例如,尽管图中A方案实现了最高的计算性能,但是目标平台无法满足该方案所需的存储器带宽。所以,综合分析比较,最终选择方案C作为第5层的设计方案,它的带宽要求为2.2GB/s。

    图6

    5)多层CNN加速器设计

    在此之前,我们讨论了如何找到每个卷积层的最优实现方案。但是,在CNN应用中,这些参数可能在不同的层之间需要变化。表3描述了该应用CNN模型中所有层的最优展开因子(Tm和Tn)。为了解决这个问题,本方案采用的方法是在不同卷积层之间设计具有均匀展开因子的硬件架构。具有统一展开因子的CNN加速器设计和实现简单,但可能对某些层是次优的。表3显示,使用统一展开因子<64,7>,与每个优化卷积层的总执行周期相比,退化在5%以内。因此,方案选择了CNN加速器在卷积层上的统一展开因子。

    表3

    解决完上述问题,图7就是整个实现方案架构。实验是在具有Xilinx FPGA芯片Virtex7 485t的VC707板上完成。其工作频率为100 MHz。 为了比较性能,CPU软件实现在具有15MB高速缓存的Intel Xeon CPU E5-2430(@ 2.20GHz)上运行。

    图7

    该实验的资源利用情况如表4所示。

    表4

    加速器的性能比较如表5所示。

    表5

    表6显示,CPU软件实现和FPGA实现之间的消耗能量的比例至少为24.6x。 FPGA实现使用的能量远远低于其CPU实现。

    表6

    同时,如表7所示,如果使用定点计算引擎,该设计方案可以实现更好的性能和性能密度,因为定点处理元件使用的资源少得多。

    表7

    参考文献:

    [1] Zhang C, Li P, Sun G, et al. Optimizing fpga-based accelerator design for deep convolutional neural networks[C] Proceedings of the 2015 ACM/SIGDA International Symposium on Field-Programmable Gate Arrays. ACM, 2015: 161-170.

     

    展开全文
  • 使用深度学习cnn识别人脸性别

    千次阅读 2018-03-21 15:08:10
    使用深度学习cnn识别人脸性别 关于卷积神经网络 cnn的原理,解释网上一大堆,我就不重复了,就是特征提取的过程,推荐看谷歌的介绍。 简单了解 通过百度图片,下了400+张亚洲男性和400+女性的脸部做训练! ...

    使用深度学习cnn识别人脸性别

    关于卷积神经网络

    cnn的原理,解释网上一大堆,我就不重复了,就是特征提取的过程,推荐看谷歌的介绍。

    简单了解

    通过百度图片,下了400+张亚洲男性和400+女性的脸部做训练!
    图片集合

    图片集合

    先看看实际的效果:
    识别结果

    shut up and show me code !

    我最喜欢这句话了,简单明了!
    需要安装numpy,sklearn,keras,opencv,tensorflow
    我的python版本是 3.6.4
    全部完整代码,包含了数据下载,从收集到训练,到模型生成,结果,全套代码(//▽//),详细使用详见github里面说明。
    链接在文章最下面,这里做一下简单解释:
    目录列表
    image_spider.py 是通过百度下载设置关键字的图片,关键字在代码里面
    get_face.py 是对下载的图片进行脸部的提取,对训练数据进行筛选
    其他三个python文件是做处理训练显示用
    haarcascade_frontalface_alt.xml 是opencv自带的人脸检测特征集

    提取图片信息,用文件夹的名字做label
    这里写图片描述
    训练的问价放在gender_image文件夹下分类,0是女,1是男

    def extract_data(self,train_path):
          imgs, labels, counter = get_file(train_path)
          print(labels)
          # 避免过拟合,采用交叉验证,验证集占训练集30%,固定随机种子(random_state)
          X_train, X_test, y_train, y_test = train_test_split(imgs, labels, test_size=0.3,
                                                              random_state=random.randint(0, 100))
    
          #数据预处理 keras backend 用的TensorFlow 黑白图片 channel 1
          X_train = X_train.reshape(X_train.shape[0], 1, self.img_size, self.img_size) / 255.
          X_test = X_test.reshape(X_test.shape[0], 1, self.img_size, self.img_size) / 255.
    
          #label 转为 one-hot 数据
          Y_train = np_utils.to_categorical(y_train, num_classes=counter)
          Y_test = np_utils.to_categorical(y_test, num_classes=counter)
    
          self.X_train = X_train
          self.X_test = X_test
          self.Y_train = Y_train
          self.Y_test = Y_test
          self.nb_classes = counter

    建立神经网络

        def build_model(self,dataset):
            self.model = Sequential()
            #进行一层卷积 输出 shape (32,128,128)
            self.model.add(Convolution2D(filters=32,kernel_size=5,strides=1, padding='same',data_format='channels_first', input_shape=dataset.X_train.shape[1:]))
            #使用relu激励函数
            self.model.add(Activation('relu'))
            #池化,输出为shape (32,64,64)
            self.model.add(MaxPooling2D(pool_size=2,strides=2,padding='same',data_format='channels_first'))
            #dropout 防止过拟合
            self.model.add(Dropout(0.25))
    
            #进行一层卷积 输出为shape (64,32,32)
            self.model.add(Convolution2D(64, 5, strides=1, padding='same', data_format='channels_first'))
            # 使用relu激励函数
            self.model.add(Activation('relu'))
            # 池化,输出为原来的一半 shape (64,32,32)
            self.model.add(MaxPooling2D(2, 2, 'same', data_format='channels_first'))
            # dropout 防止过拟合
            self.model.add(Dropout(0.25))
    
            #全连接层
            self.model.add(Flatten())
            self.model.add(Dense(512))
            self.model.add(Activation('relu'))
            self.model.add(Dropout(0.5))
            self.model.add(Dense(dataset.nb_classes))
            self.model.add(Activation('softmax'))
    
            self.model.summary()

    训练模型后会生成store文件夹存储model文件。
    训练完成后运行image_show.py就能看运行结果了。

    github地址https://github.com/StevenKe8080/recognition_gender

    也可以访问网站试试(•ิ_•ิ):http://www.aidump.com/CoolImage/GuessGender 试一试结果
    可能是训练数据样本集不多的原因,正确率不是很高,可通过增加样本集,增加训练次数来提高正确率

    展开全文
  • MATLAB深度学习CNN包计算次数统计

    千次阅读 2017-04-19 20:54:16
    MATLAB深度学习CNN包计算次数统计以及使用OPENCL的必要性分析
  • cnn tensorflow 代码
  • 深度学习cnn调参

    2017-08-16 09:10:06
    深度学习中,有许多不同的深度网络结构,包括卷积神经网络(CNN或convnet)、长短期记忆网络(LSTM)和生成对抗网络(GAN)等。 在计算机视觉领域,对卷积神经网络(简称为CNN)的研究和应用都取得了显著的成果。CNN...
  • 转载:Keras深度学习CNN+LSTM预测黄金主力收盘价 数据由JQData本地量化金融数据支持 上一篇做了2个实验,预测黄金期货主力合约的收盘价。 实验2: 使⽤历史前5个时刻的 open close high low volume money 预测当前...
  • 深度学习CNN中间特征图

    千次阅读 2018-12-30 15:18:33
    关于CNN基本概念知识,建议先阅读以下大神链接的讲解: 《吊炸天的CNNs,这是我见过最详尽的图解!(上)》 《吊炸天的CNNs,这是我见过最详尽的图解!(下)》 借用上面链接中的cnn结构图: 下面用keras框架...
  • 而这一研究获得的诺贝尔奖, 之后计算机科学家对深度学习的研究, 根据这一原理, 获得了图灵奖。 人类视觉看到的物体其实是通过光线进入视网膜, 再刺激光感细胞, 再传到大脑的视觉控制区产生的。所以视觉并非...
  • 阅读全文请点击深度学习(DeepLearning)尤其是卷积神经网络(CNN)作为近几年来模式识别中的研究重点,受到人们越来越多的关注,相关的参考文献也是层出不穷,连续几年都占据了CVPR的半壁江山,但是万变不离其宗,...
  • FPGA 深度学习CNN加速

    千次阅读 2017-10-16 16:28:08
    http://blog.csdn.net/kkk584520/article/details/9993281
  • 深度学习CNN图像分割小结

    千次阅读 2018-11-06 18:03:15
    FCN(Fully Convolutional Networks), ... Mask RCNN(Instan Segmentation by FCN ... 我们知道,CNN有很出色的特征提取能力,避免了人工提取特征的局限性,这也意味着CNN有很好的分类性能,它解决了图像识别的一大难...
  • 【Python与机器学习 7-3】深度学习 CNN

    千次阅读 2018-05-04 19:32:56
    深度学习解决的核心问题之一就是自动地将简单的特征组合成更加复杂的特征 应用领域 深度学习 ≈ 深层神经网络 深度学习最早兴起于图像识别,现在还用于语音识别,自然语音处理,人机博弈等领域 通过例子介绍...
  • 深度学习 CNN FCN segnet简单比较

    千次阅读 2018-10-29 12:01:12
    CNN:图像级 将特征图映射成一个固定长度的特征向量。  多层结构自动学习,浅层感知域小,只能学习局部,较深卷积层有较大感知,能学习抽象  抽象特征对大小,方向,位置等敏感度低 FCN:像素级 可接受任意尺度...
  • 深度学习很火,说起深度学习中一个很重要的概念——卷积神经网络(CNN)似乎也人人皆知。不过,CNN究竟是什么,涉及哪些概念,经过如何发展,真正要有逻辑地归纳一遍,估计不少人都说不清。日前,南洋理工大学研究...
  • 深度学习CNN提升性能的方法总结

    千次阅读 2018-12-03 23:55:02
    发现作者在训练一些模型的过程中使用了一些共通的方法来增加网络的性能,并且在ImageNet等相关数据集上得到了明显的性能提升,下面按照CNN模型成长的轨迹来总结一些可以用在平常我们自己训练深度网络模型中的技术。...
  • 深度学习CNN的feature map

    千次阅读 2018-01-22 14:24:58
    输入:N0*C0*H0*W0 输出:N1*C1*H1*W1 输出的feature map大小: H1=H0+2×pad−kernel_sizestride+1 W1=W0+2×pad−kernel_sizestride+1 注:当stride为1时,若pad=kernel_size−12,那么经过计算后的feature ...
  • 这个PPT报告是本人在大组会报告的时候做的一个方向总结性报告,有一定的参考价值
  • 基于FPGA的深度学习CNN加速器设计

    万次阅读 2018-01-08 09:50:02
    因为CNN的特有计算模式,通用处理器对于CNN实现效率并不高,不能满足性能要求。 因此,近来已经提出了基于FPGA,GPU甚至ASIC设计的各种加速器来提高CNN设计的性能。 在这些方法中,基于FPGA的加速器引起了研究人员...
  • matlab:深度学习CNN matlab代码解析

    千次阅读 2017-11-27 15:19:44
    CNN卷积神经网络代码理解    自己平时看了一些论文,但老感觉看完过后就会慢慢的淡忘,某一天重新拾起来的时候又好像没有看过一样。所以想习惯地把一些感觉有用的论文中的知识点总结整理一下,一方面在整理...
  • 本文使用深度学习CNN进行特征提取,并使用机器学习经典算法(使用pca降维?)svm在此基础上进行分类。模型参数使用上文迁移学习第一部分训练结果。 from keras.applications import VGG16 from keras...
  • 平安的面试官问到CNN的池化层有什么作用?为什么CNN对于图像处理和文本很有优势?我的回答池化层可以缩小尺寸加快训练速度,还可以减少过拟合的风险。CNN用于图像方面有优势主要是卷积层,池化层的存在,然后又扯了...
  • 猫狗图片的识别分类,通过一个Alexnet网络模型,对猫狗图片数据集进行训练,并保存模型
  • 文章目录paddlepaddle深度学习框架的一般步骤CNN模型中,卷积神经网络中常用名称的解释。网络搭建 paddlepaddle深度学习框架的一般步骤 CNN模型中,卷积神经网络中常用名称的解释。 网络搭建 在CNN模型中,卷积神经...
  • 近一两年cnn在检测这块的发展突飞猛进,下面详细review下整个cnn检测领域模型的发展,以及在时间性能上的发展。 一、RCNN 流程: Extract region(off model) + extract features(on model) + classifyregions ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,078
精华内容 4,431
关键字:

深度学习cnn