卷积神经网络(CNN)由输入层、卷积层、激活函数、池化层、全连接层组成,即INPUT(输入层)-CONV(卷积层)-RELU(激活函数)-POOL(池化层)-FC(全连接层)

卷积层

用它来进行特征提取,如下: Convolutional 输入图像是32x32x3,3是它的深度(即R、G、B),卷积层是一个5x5x3的filter(感受野),这里注意:感受野的深度必须和输入图像的深度相同。通过一个filter与输入图像的卷积可以得到一个28x28x1的特征图,上图是用了两个filter得到了两个特征图; 我们通常会使用多层卷积层来得到更深层次的特征图。如下: conv-levels conv-levels1

关于卷积的过程图解如下: conv-calc

输入图像和filter的对应位置元素相乘再求和,最后再加上b,得到特征图。如图中所示,filter w0的第一层深度和输入图像的蓝色方框中对应元素相乘再求和得到0,其他两个深度得到2,0,则有0+2+0+1=3即图中右边特征图的第一个元素3.,卷积过后输入图像的蓝色方框再滑动,stride(步长)=2,如下: 如上图,完成卷积,得到一个3x3x1的特征图;在这里还要注意一点,即zero pad项,即为图像加上一个边界,边界元素均为0.(对原输入无影响)一般有

F=3 => zero pad with 1 F=5 => zero pad with 2 F=7=> zero pad with 3,边界宽度是一个经验值,加上zero pad这一项是为了使输入图像和卷积后的特征图具有相同的维度,如:

输入为5x5x3,filter为3x3x3,在zero pad 为1,则加上zero pad后的输入图像为7x7x3,则卷积后的特征图大小为5x5x1((7-3)/1+1),与输入图像一样; 而关于特征图的大小计算方法具体如下:

feture-calc 卷积层还有一个特性就是“权值共享”原则。如下图: value-share

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

所谓的权值共享就是说,给一张输入图片,用一个filter去扫这张图,filter里面的数就叫权重,这张图每个位置就是被同样的filter扫的,所以权重是一样的,也就是共享。 激活函数 如果输入变化很小,导致输出结构发生截然不同的结果,这种情况是我们不希望看到的,为了模拟更细微的变化,输入和输出数值不只是0到1,可以是0和1之间的任何数,

激活函数是用来加入非线性因素的,因为线性模型的表达力不够 这句话字面的意思很容易理解,但是在具体处理图像的时候是什么情况呢?我们知道在神经网络中,对于图像,我们主要采用了卷积的方式来处理,也就是对每个像素点赋予一个权值,这个操作显然就是线性的。但是对于我们样本来说,不一定是线性可分的,为了解决这个问题,我们可以进行线性变化,或者我们引入非线性因素,解决线性模型所不能解决的问题。 这里插一句,来比较一下上面的那些激活函数,因为神经网络的数学基础是处处可微的,所以选取的激活函数要能保证数据输入与输出也是可微的,运算特征是不断进行循环计算,所以在每代循环过程中,每个神经元的值也是在不断变化的。 这就导致了tanh特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果显示出来,但有是,在特征相差比较复杂或是相差不是特别大时,需要更细微的分类判断的时候,sigmoid效果就好了。 还有一个东西要注意,sigmoid 和 tanh作为激活函数的话,一定要注意一定要对 input 进行归一话,否则激活后的值都会进入平坦区,使隐层的输出全部趋同,但是 ReLU 并不需要输入归一化来防止它们达到饱和。

构建稀疏矩阵,也就是稀疏性,这个特性可以去除数据中的冗余,最大可能保留数据的特征,也就是大多数为0的稀疏矩阵来表示。其实这个特性主要是对于Relu,它就是取的max(0,x),因为神经网络是不断反复计算,实际上变成了它在尝试不断试探如何用一个大多数为0的矩阵来尝试表达数据特征,结果因为稀疏特性的存在,反而这种方法变得运算得又快效果又好了。所以我们可以看到目前大部分的卷积神经网络中,基本上都是采用了ReLU 函数。

常用的激活函数 激活函数应该具有的性质:

  1. 非线性。线性激活层对于深层神经网络没有作用,因为其作用以后仍然是输入的各种线性变换。。
  2. 连续可微。梯度下降法的要求。
  3. 范围最好不饱和,当有饱和的区间段时,若系统优化进入到该段,梯度近似为0,网络的学习就会停止。
  4. 单调性,当激活函数是单调时,单层神经网络的误差函数是凸的,好优化。
  5. 在原点处近似线性,这样当权值初始化为接近0的随机值时,网络可以学习的较快,不用可以调节网络的初始值。 目前常用的激活函数都只拥有上述性质的部分,没有一个拥有全部的~~

Sigmoid函数 (目前已被淘汰) sigmoid

缺点:

  • 饱和时梯度值非常小。由于BP算法反向传播的时候后层的梯度是以乘性方式传递到前层,因此当层数比较多的时候,传到前层的梯度就会非常小,网络权值得不到有效的更新,即梯度耗散。如果该层的权值初始化使得f(x) 处于饱和状态时,网络基本上权值无法更新。
  • 输出值不是以0为中心值。

Tanh函数

tanh 其中σ(x) 为sigmoid函数,仍然具有饱和的问题。

ReLU函数

relu Alex在2012年提出的一种新的激活函数。该函数的提出很大程度的解决了BP算法在优化深层神经网络时的梯度耗散问题

优点:

  • x>0 时,梯度恒为1,无梯度耗散问题,收敛快;
  • 增大了网络的稀疏性。当x<0 时,该层的输出为0,训练完成后为0的神经元越多,稀疏性越大,提取出来的特征就约具有代表性,泛化能力越强。即得到同样的效果,真正起作用的神经元越少,网络的泛化性能越好
  • 运算量很小;

缺点:

如果后层的某一个梯度特别大,导致W更新以后变得特别大,导致该层的输入<0,输出为0,这时该层就会‘die’,没有更新。当学习率比较大时可能会有40%的神经元都会在训练开始就‘die’,因此需要对学习率进行一个好的设置。 由优缺点可知max(0,x) 函数为一个双刃剑,既可以形成网络的稀疏性,也可能造成有很多永远处于‘die’的神经元,需要tradeoff。

Leaky ReLU函数

lrelu 改善了ReLU的死亡特性,但是也同时损失了一部分稀疏性,且增加了一个超参数,目前来说其好处不太明确

Maxout函数

maxout 泛化了ReLU和Leaky ReLU,改善了死亡特性,但是同样损失了部分稀疏性,每个非线性函数增加了两倍的参数

真实使用的时候最常用的还是ReLU函数,注意学习率的设置以及死亡节点所占的比例即可

池化层

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

pooling

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

maxpool 同样地采用一个22的filter,max pooling是在每一个区域中寻找最大值,这里的stride=2,最终在原特征图中提取主要特征得到右图。 (Avy pooling现在不怎么用了,方法是对每一个22的区域元素求和,再除以4,得到主要特征),而一般的filter取22,最大取33,stride取2,压缩为原来的1/4. 注意:这里的pooling操作是特征图缩小,有可能影响网络的准确度,因此可以通过增加特征图的深度来弥补(这里的深度变为原来的2倍)。

pool-calc 在卷积神经网络中,我们经常会碰到池化操作,而池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合)。

为什么可以通过降低维度呢? 因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)来代表这个区域的特征。

一般池化(General Pooling)

池化作用于图像中不重合的区域(这与卷积操作不同),过程如下图。

我们定义池化窗口的大小为sizeX,即下图中红色正方形的边长,定义两个相邻池化窗口的水平位移/竖直位移为stride。一般池化由于每一池化窗口都是不重复的,所以sizeX=stride。

generalpool 最常见的池化操作为平均池化mean pooling和最大池化max pooling: 平均池化:计算图像区域的平均值作为该区域池化后的值。 最大池化:选图像区域的最大值作为该区域池化后的值。

重叠池化(OverlappingPooling 重叠池化正如其名字所说的,相邻池化窗口之间会有重叠区域,此时sizeX>stride。 论文中Krizhevsky, I. Sutskever, andG. Hinton, “Imagenet classification with deep convolutional neural networks,”in NIPS,2012.中,作者使用了重叠池化,其他的设置都不变的情况下, top-1和top-5 的错误率分别减少了0.4% 和0.3%。

空金字塔池化(Spatial Pyramid Pooling) 空间金字塔池化可以把任何尺度的图像的卷积特征转化成相同维度,这不仅可以让CNN处理任意尺度的图像,还能避免cropping和warping操作,导致一些信息的丢失,具有非常重要的意义。 一般的CNN都需要输入图像的大小是固定的,这是因为全连接层的输入需要固定输入维度,但在卷积操作是没有对图像尺度有限制,所有作者提出了空间金字塔池化,先让图像进行卷积操作,然后转化成维度相同的特征输入到全连接层,这个可以把CNN扩展到任意大小的图像

pyramidpool 空间金字塔池化的思想来自于Spatial Pyramid Model,它一个pooling变成了多个scale的pooling。用不同大小池化窗口作用于卷积特征,我们可以得到1x1,2x2,4x4的池化结果,由于conv5中共有256个过滤器,所以得到1个256维的特征,4个256个特征,以及16个256维的特征,然后把这21个256维特征链接起来输入全连接层,通过这种方式把不同大小的图像转化成相同维度的特征。

pyramidcalc 对于不同的图像要得到相同大小的pooling结果,就需要根据图像的大小动态的计算池化窗口的大小和步长。假设conv5输出的大小为axa,需要得到nxn大小的池化结果,可以让窗口大小sizeX为,步长为 。下图以conv5输出的大小为13x13为例。

全连接层

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

总的一个结构大致如下: fullconect

本文链接:http://nix.pub/article/Conv/