CNN卷积原理

https://blog.csdn.net/qq_31456593/article/details/76083091

https://blog.csdn.net/qq_31456593/article/details/76083091

https://www.zybuluo.com/hanbingtao/note/485480


一、卷积神经网络
1、简介

卷积神经网络最主要的特点就是局部感知和权值共享。局部感知使其每次只需感知较小的区域,降低了参数数量,也提供了特征拟合能力(特征简单了,拟合更容易)。而全值共享,使一些基本特征可得到重复利用,使参数可以共享,提高了神经网络的训练效果。

卷积层: 做特征的提取,输出对应得feature map 
池化层: 就是对数据进行下采样,减少数据处理量同时保留有用信息 
全连接层: 就是对提取特征进行组织综合,输出识别物体的分类情况

 

 

二、卷积神经网络各层实现
1、网络结构
下图是一个经典的CNN结构。 

可以看出,CNN中主要有两种类型的网络层,分别是卷积层和池化/采样层(Pooling)。卷积层的作用是提取图像的各种特征;池化层的作用是对原始特征信号进行抽象,从而大幅度减少训练参数,另外还可以减轻模型过拟合的程度。

2、卷积层
 

左边是输入(7*7*3中,7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)
中间部分是两个不同的滤波器Filterw0、Filter w1
最右边则是两个不同的输出(即2个feature map,该隐藏层深度为2,提取2类特征)
随着左边数据窗口的平移滑动,卷积核Filter w0 / Filter w1对不同的局部数据进行卷积计算。其中每个卷积核有3个3*3的矩阵分别与与三个通道的观察窗口做卷积最后求和作为输出。 
卷积核的权重矩阵就是训练时要学习的,它就是要提取的特征,神经网络再根据卷积提取的特征去观察输入(比如图片)
 

3、 ReLU层(激活层)
在每个卷积层之后,通常会立即应用一个非线性层(或激活层)。其目的是给一个在卷积层中刚经过线性计算操作(只是数组元素依次(element wise)相乘与求和)的系统引入非线性特征。

Relu函数作为激活函数,有下面几大优势:

1.速度快 和sigmoid函数需要计算指数和倒数相比,relu函数其实就是一个max(0,x),计算代价小很多。
2.减轻梯度消失问题 回顾计算梯度的公式∇=σ′δx∇=σ′δx。其中,σ′σ′是sigmoid函数的导数。在使用反向传播算法进行梯度计算时,每经过一层sigmoid神经元,梯度就要乘上一个σ′σ′。从下图可以看出,σ′σ′函数最大值是1/4。因此,乘一个会导致梯度越来越小,这对于深层网络的训练是个很大的问题。而relu函数的导数是1,不会导致梯度变小。当然,激活函数仅仅是导致梯度减小的一个因素,但无论如何在这方面relu的表现强于sigmoid。使用relu激活函数可以让你训练更深的网络。
3.稀疏性 通过对大脑的研究发现,大脑在工作的时候只有大约5%的神经元是激活的,而采用sigmoid激活函数的人工神经网络,其激活率大约是50%。有论文声称人工神经网络在15%-30%的激活率时是比较理想的。因为relu函数在输入小于0时是完全不激活的,因此可以获得一个更低的激活率
 

4、池化层

池化层里我们用的maxpooling,将主要特征保留,舍去多余无用特征,这样就可以实现信息压缩,比如下图所示 


在几个 ReLU 层之后,程序员也许会选择用一个池化层(pooling layer)。它同时也被叫做下采样(downsampling)层。在这个类别中,也有几种可供选择的层,最受欢迎的就是最大池化( max-pooling)。它基本上采用了一个过滤器(通常是 2x2 的)和一个同样长度的步幅。然后把它应用到输入内容上,输出过滤器卷积计算的每个子区域中的最大数字。

 

池化层还有其他选择,比如平均池化(average pooling)和 L2-norm 池化 。这一层背后的直观推理是:一旦我们知道了原始输入(这里会有一个高激活值)中一个特定的特征,它与其它特征的相对位置就比它的绝对位置更重要。可想而知,这一层大幅减小了输入卷的空间维度(长度和宽度改变了,但深度没变)。这到达了两个主要目的。第一个是权重参数的数目减少到了75%,因此降低了计算成本。第二是它可以控制过拟合(overfitting)。这个术语是指一个模型与训练样本太过匹配了,以至于用于验证和检测组时无法产生出好的结果。出现过拟合的表现是一个模型在训练集能达到 100% 或 99% 的准确度,而在测试数据上却只有50%。

5 Dropout 层
训练之后,神经网络的权重与训练样本太过匹配以至于在处理新样本的时候表现平平。Dropout 的概念在本质上非常简单。Dropout 层将「丢弃(drop out)」该层中一个随机的激活参数集,即在前向通过(forward pass)中将这些激活参数集设置为 0。简单如斯。既然如此,这些简单而且似乎不必要且有些反常的过程的好处是什么?在某种程度上,这种机制强制网络变得更加冗余。这里的意思是:该网络将能够为特定的样本提供合适的分类或输出,即使一些激活参数被丢弃。此机制将保证神经网络不会对训练样本「过于匹配」,这将帮助缓解过拟合问题。另外,Dropout 层只能在训练中使用,而不能用于测试过程,这是很重要的一点。 


6完全连接层(输出层)

检测高级特征之后,网络最后的完全连接层就更是锦上添花了。简单地说,这一层处理输入内容(该输入可能是卷积层、ReLU 层或是池化层的输出)后会输出一个 N 维向量,N 是该程序必须选择的分类数量。例如,如果你想得到一个数字分类程序,如果有 10 个数字,N 就等于 10。这个 N 维向量中的每一数字都代表某一特定类别的概率。例如,如果某一数字分类程序的结果矢量是 [0 .1 .1 .75 0 0 0 0 0 .05],则代表该图片有 10% 的概率是 1、10% 的概率是 2、75% 的概率是 3、还有 5% 的概率是 9(注:还有其他表现输出的方式,这里只展示了 softmax 的方法)。完全连接层观察上一层的输出(其表示了更高级特征的激活映射)并确定这些特征与哪一分类最为吻合。激活映射中的高数值便会代表诸如翅膀或鸟喙之类的高级特征。大体上来说,完全连接层观察高级特征和哪一分类最为吻合和拥有怎样的特定权重,因此当计算出权重与先前层之间的点积后,你将得到不同分类的正确概率。

三、相关问题
好了,现在来看一下我们的卷积神经网络。还记得过滤器、感受野和卷积吗?很好。现在,要改变每一层的行为,有两个主要参数是我们可以调整的。选择了过滤器的尺寸以后,我们还需要选择步幅(stride)和填充(padding)。

1、步幅
步幅控制着过滤器围绕输入内容进行卷积计算的方式。在第一部分我们举的例子中,过滤器通过每次移动一个单元的方式对输入内容进行卷积。过滤器移动的距离就是步幅。在那个例子中,步幅被默认设置为1。步幅的设置通常要确保输出内容是一个整数而非分数。让我们看一个例子。想象一个 7 x 7 的输入图像,一个 3 x 3 过滤器(简单起见不考虑第三个维度),步幅为 1。这是一种惯常的情况。

 
还是老一套,对吧?看你能不能试着猜出如果步幅增加到 2,输出内容会怎么样。 
 
所以,正如你能想到的,感受野移动了两个单元,输出内容同样也会减小。注意,如果试图把我们的步幅设置成 3,那我们就会难以调节间距并确保感受野与输入图像匹配。正常情况下,程序员如果想让接受域重叠得更少并且想要更小的空间维度(spatial dimensions)时,他们会增加步幅。

2、填充
现在让我们看一下填充(padding)。在此之前,想象一个场景:当你把 5 x 5 x 3 的过滤器用在 32 x 32 x 3 的输入上时,会发生什么?输出的大小会是 28 x 28 x 3。注意,这里空间维度减小了。如果我们继续用卷积层,尺寸减小的速度就会超过我们的期望。在网络的早期层中,我们想要尽可能多地保留原始输入内容的信息,这样我们就能提取出那些低层的特征。比如说我们想要应用同样的卷积层,但又想让输出量维持为 32 x 32 x 3 。为做到这点,我们可以对这个层应用大小为 2 的零填充(zero padding)。零填充在输入内容的边界周围补充零。如果我们用两个零填充,就会得到一个 36 x 36 x 3 的输入卷。 
 
如果我们在输入内容的周围应用两次零填充,那么输入量就为 32×32×3。然后,当我们应用带有 3 个 5×5×3 的过滤器,以 1 的步幅进行处理时,我们也可以得到一个 32×32×3 的输出

如果你的步幅为 1,而且把零填充设置为 
 
K 是过滤器尺寸,那么输入和输出内容就总能保持一致的空间维度。

计算任意给定卷积层的输出的大小的公式是 


 
其中 O 是输出尺寸,K 是过滤器尺寸,P 是填充,S 是步幅。

但是存在两个缺点:

1.卷积后的矩阵越变越小(如果卷积层100层,每一层都缩小最终得到的将是很小的图片)

2.输入矩阵(左)边缘像素(绿阴影)只被计算过一次,而中间像素(红阴影)被卷积计算多次,意味着丢失图像角落信息

利用padding 解决上述问题


上图将输入图像矩阵周围填充一层像素(通常填充元素为0)填充数量p=1,输出图像大小变为n+2p-f+1 * n+2p-f+1,6*6——>8*8,卷积输出为6*6,与原输入图像大小相同,解决了卷积会使图片变小的缺点。(当然也可以填充两层);输出矩阵绿色阴影块是受输入矩阵绿色阴影值影响的部分,削弱了边缘信息丢失的缺点。

 

 "SAME"卷积方式

对于上图,图像的每一个点都作为卷积核的中心。最后得到5*5的结果,如下图:

通俗的来说:首先在原图外层补一圈0,将原图的第一点作为卷积核中心,若一圈0不够,继续补一圈0。

"VALID" 卷积方式

 

 

  1. def conv2d(input, filter, strides, padding)

  2. Given an input tensor of shape `[batch, in_height, in_width, in_channels]

  3. filter: A `Tensor`. Must have the same type as `input`.
          A 4-D tensor of shape
          `[filter_height, filter_width, in_channels, out_channels]`in_channels.与图片相同

  4. 具体说明:https://blog.csdn.net/mao_xiao_feng/article/details/78004522

 

max pooling是CNN当中的最大值池化操作,其实用法和卷积很类似

有些地方可以从卷积去参考【TensorFlow】tf.nn.conv2d是怎样实现卷积的? 

 

tf.nn.max_pool(value, ksize, strides, padding, name=None)

参数是四个,和卷积很类似:

 

第一个参数value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch, height, width, channels]这样的shape

第二个参数ksize:池化窗口的大小,取一个四维向量,一般是[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1

第三个参数strides:和卷积类似,窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1]

第四个参数padding:和卷积类似,可以取'VALID' 或者'SAME'

返回一个Tensor,类型不变,shape仍然是[batch, height, width, channels]这种形式https://blog.csdn.net/coder_xiaohui/article/details/78025379


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值