图像处理卷积层的作用

2019-02-18 17:50:39 idwtwt 阅读数 24809

转于:《入门PyTorch》

卷积层是卷积神经网络的核心, 大多数计算都是在卷积层中进行的。

1 卷积层


1.1 概述


首先介绍卷积神经网络的参数。 这些参数是由一些可学习的滤波器集合构成的, 每个滤波器在空间上( 宽度和高度) 都比较小, 但是深度和输入数据的深度保持一致。 举例来说, 卷积神经网络的第一层卷积一个典型的滤波器的尺寸可以是5×5×3( 宽和高都是5) , 或者是3×3×3( 宽和高都是3) , 这里的宽度和高度可以任意定义, 但是深度必须是3, 因为深度要和输入一致, 而输入的图片是3通道的。 在前向传播的时候, 让每个滤波器都在输入数据的宽度和高度上滑动( 卷积) , 然后计算整个滤波器和输入数据任意一处的内积。

当滤波器沿着输入数据的宽度和高度滑动时, 会生成一个二维的激活图, 激活图上的每个空间位置表示了原图片对于该滤波器的反应。 直观来看, 网络会让滤波器学习到当它看到某些类型的视觉特征的时候就激活, 具体的视觉特征可以是边界、 颜色、 轮廓、 甚至可以是网络更高层上的蜂巢状或者车轮状图案。

在每个卷积层上, 会有一整个集合的滤波器, 比如20个, 这样就会形成20张二维的、 不同的激活图, 将这些激活图在深度方向上层叠起来就形成了卷积层的输出。

如果用大脑和生物神经元做比喻, 那么输出的3D数据中的每个数据都可以看成是神经元的一个输出, 而该神经元只是观察输入数据中的一种特征, 并且和空间上左右两边的所有神经元共享参数( 因为这些输出都是使用同一个滤波器得到的结果) 。 下面介绍卷积神经网络中的神经元连接, 它们在空间中的排列, 以及它们参数共享的模式。

 

1.2 局部连接


在处理图像这样高维度输入的时候, 让每个神经元都与它那一层中的所有神经元进行全连接是不现实的。 相反, 让每个神经元只与输入数据的一个局部区域连接是可行的, 为什么可以这样做呢? 其实这是因为图片特征的局部性, 所以只需要通过局部就能提取出相应的特征。

与神经元连接的空间大小叫做神经元的感受野( receptive field) , 它的大小是一个人为设置的超参数, 这其实就是滤波器的宽和高。 在深度方向上, 其大小总是和输入的深度相等。 最后强调一下, 对待空间维度( 宽和高) 和深度维度是不同的, 连接在空间上是局部的, 但是在深度上总是和输入的数据深度保持一致。

图4.6形象地展示了感受野在空间和深度上的大小, 左边表示输入的数据, 中间是感受野, 右边每个小圆点表示一个神经元。 下面举一个具体的例子来说明一下。 比如输入的数据尺寸为32×32×3, 如果感受野( 滤波器尺寸) 是5×5, 卷积层中每个神经元会有输入数据中5×5×3区域的权重, 一共5×5×3=75个权重。 这里再次强调感受野深度的大小必须是3, 和输入数据保持一致。 比如输入数据体尺寸是16×16×20, 感受野是3×3, 卷积层中每个神经元和输入数据体之间就有3×3×20=180个连接, 这里的深度必须是20, 和输入数据一致。

1.3 空间排列


前面介绍了每个神经元只需要与输入数据的局部区域相连接, 但是没有介绍卷积层中神经元的数量和它们的排列方式、 输出深度、 滑动步长, 以及边界填充控制着卷积层的空间排布。


首先, 卷积层的输出深度是一个超参数, 它与使用的滤波器数量一致, 每种滤波器所做的就是在输入数据中寻找一种特征。 比如说输入一张原始图片, 卷积层输出的深度是20, 这说明有20个滤波器对数据进行处理, 每种滤波器寻找一种特征进行激活。


其次, 在滑动滤波器的时候, 必须指定步长。 比如步长为1, 说明滤波器每次移动1个像素点。 当步长为2的时候, 滤波器会滑动2个像素点。 滑动的操作会使得输出的数据在空间上变得更小。

最后介绍边界填充, 可以将输入数据用0在边界进行填充, 这里将0填充的尺寸作为一个超参数, 有一个好处就是, 可以控制输出数据在空间上的尺寸, 最常用来保证输入和输出在空间上尺寸一致。输出的尺寸到底是多少呢? 其实可以用一个公式来计算, 就是\frac{W-F+2P}{S}+1, 其中W 表示输入的数据大小, F 表示卷积层中神经元的感受野尺寸, S表示步长, P 表示边界填充0的数量。 比如输入是7×7, 滤波器是3×3, 步长是1, 填充的数量是0, 那么根据公式, 就能得到 , 即输出的空间大小是5×5, 如果步长是2,那么 , 输出的空间大小就是3×3。 可以用图4.7所示的这个一维的例子来具体说明。


右上角表示神经网络的权重, 其中输入数据的大小为5, 感受野的大小为3; 左边表示滑动步长为1, 且填充也为1; 右边表示滑动步长为2, 填充为1。

1.4 零填充的使用


从上面的例子中, 我们看到输入的维度是5, 输出的维度也是5。之所以如此, 是因为感受野是3, 并且使用了1的零填充。 如果不使用零填充, 那么输出数据的维度也就只有3, 因为\frac{5-3+2*0}{1}+1=3 。 一般来说, 当步长S=1时, 零填充的值为P=P=\frac{F-1}{2} , 这样就能够保证输入的数据和输出的数据具有相同的空间尺寸。


1.5 步长的限制


通过上面的公式我们知道步长的选择是有所限制的, 举例来说,当输入尺寸W=10的时候, 如果不使用零填充, 即P=0, 滤波器尺寸F=3, 这样步长S=2就行不通, 因为\frac{10-3+0}{2}+1=4.5 , 结果不是一个整数, 这就说明神经元不能整齐对称地滑过输入数据体, 这样的超参数设置是无效的, 使用PyTorch的时候就会报错, 可以使用零填充让设置变得合理。 在后面卷积神经网络的结构设计中, 需要合理地设计网络的尺寸, 使得所有维度都能够正常工作, 这件事并没有看上去那么容易。


1.6 参数共享


在卷积层使用参数共享可以有效地减少参数的个数, 这样之所以能够行得通, 是因为之前介绍的特征的相同性, 也就是说相同的滤波器能够检测出不同位置的相同特征。 比如说一个卷积层的输出是20×20×32, 那么其中神经元的个数就是20×20×32=12800, 如果窗口大小是3×3, 而输入的数据体深度是10, 那么每个神经元就有3×3×10=900个参数, 这样合起来就有12800×900=11520000个参数,单单一层卷积就有这么多参数, 这样运算速度显然是特别慢的。

根据之前介绍的, 一个滤波器检测出一个空间位置( x1, y1) 处的特征, 那么也能够有效检测出( x2, y2) 位置的特征, 所以就可以用相同的滤波器来检测相同的特征, 基于这个假设, 我们就能够有效减少参数个数。 比如上面这个例子, 一共有32个滤波器, 这使得输出体的厚度是32, 每个滤波器的参数为3×3×10=900, 总共的参数就有32×900=28800个, 极大减少了参数的个数。

由参数共享我们知道输出体数据在深度切片上所有的权重都使用同一个权重向量, 那么卷积层在向前传播的过程中, 每个深度切片都可以看成是神经元的权重对输入数据体做卷积, 这也就是为什么要把这些3D的权重集合称为滤波器, 或者卷积核。

需要注意的是, 参数共享之所以能够有效, 是因为一个特征在不同位置的表现是相同的, 比如一个滤波器检测到了水平边界这个特征, 那么这个特征具有平移不变性, 所以在其他位置也能够检测出
来。 但是有时候这样的假设可能是没有意义的, 特别是当卷积神经网络的输入图像呈现的是一些明确的中心结构的时候, 希望在图片的不同位置学习到不同的特征。 一个具体的例子就是人脸识别, 人脸一般位于图片的中心, 我们希望不同的特征能够在不同的位置被学习到,比如眼睛特征或者头发特征, 正是由于这些特征在不同的地方, 才能够对人脸进行识别。

2 池化层

上一部分介绍完卷积神经网络中最核心的内容——卷积层, 下面来介绍一下第二种层结构——池化层。


通常会在卷积层之间周期性插入一个池化层, 其作用是逐渐降低数据体的空间尺寸, 这样就能够减少网络中参数的数量, 减少计算资源耗费, 同时也能够有效地控制过拟合。


下面先来介绍到底什么是池化层。 池化层和卷积层一样也有一个空间窗口, 通常采用的是取这些窗口中的最大值作为输出结果,然后不断滑动窗口, 对输入数据体每一个深度切片单独处理, 减少它的空间尺寸, 如图4.8所示。

从图4.8能够看出池化层能够有效降低数据体空间的大小, 图4.9形象地说明了窗口大小是2, 滑动步长是2的最大值池化是如何计算
的: 每次都从2×2的窗口中选择最大的数值, 同时每次滑动2个步长进入新的窗口。

池化层之所以有效, 是因为之前介绍的图片特征具有不变性, 也就是通过下采样不会丢失图片拥有的特征, 由于这种特性, 我们可以将图片缩小再进行卷积处理, 这样能够大大降低卷积运算的时间。最常用的池化层形式是尺寸为2×2的窗口, 滑动步长为2, 对图像进行下采样, 将其中75%的激活信息都丢掉, 选择其中最大的保留下来, 这其实是因为我们希望能够更加激活里面的数值大的特征, 去除一些噪声信息。


池化层有一些和卷积层类似的性质。
( 1) 输入数据体的尺寸是W1 ×H1 ×D1。
( 2) 有两个需要设置的超参数, 空间大小F 和滑动步长S。
( 3) 输出数据体的尺寸是W2×H2×D2, 其中W2=\frac{W1-F}{S}+1,H2=\frac{H1-F}{S}+1,D2=D1
( 4) 对输入进行固定函数的计算, 没有参数引入。
( 5) 池化层中很少引入零填充。
在实际中, 有两种方式: 一种是F=3, S=2, 这种池化有重叠;另外更常用的一种是F=2, S=2, 一般来说应该谨慎使用比较大的池化窗口, 以免对网络有破坏性。

除了最大值池化之外, 还有一些其他的池化函数, 比如平均池化, 或者L2范数池化。 在实际中证明, 在卷积层之间引入最大池化的效果是最好的, 而平均池化一般放在卷积神经网络的最后一层。

3 全连接层

全连接层 每个神经元与前一层所有的神经元全部连接, 而卷积神经网络只和输入数据中的一个局部区域连接, 并且输出的神经元每个深度切片共享参数。一般经过了一系列的卷积层和池化层之后, 提取出图片的特征图, 比如说特征图的大小是3×3×512, 这个时候, 将特征图中的所有神经元变成全连接层的样子, 直观上也就是将一个3D的立方体重新排列, 变成一个全连接层, 里面有3×3×512=4608个神经元, 再经过几个隐藏层, 最后输出结果。在这个过程中为了防止过拟合会引入Dropout。 最近的研究表明, 在进入全连接层之前, 使用全局平均池化能够有效地降低过拟合。

2019-01-19 10:27:37 gukedream 阅读数 650

卷积网络设计的初衷是通过卷积层和池化层逐级提取图像在各个不同抽象层次的特征,我们会有这样的疑问:现实结果真的是这样的吗?

先看图像卷积之后的结果。下面是一张卡车的图像:

卡车图像

用AlexNet网络处理之后,第一个卷积层的输出结果(我们把各个卷积核的结果依次排开了)是这样的:

卷层1的结果

可以看到这里抽取了一些边缘信息。第二个卷积层的输出结果是这样的:

卷层2的结果

它抽取了更大区域的特征。后面几个卷积层的结果是这样的:

卷层3—5的结果

卷积层3-5的结果在上图中依次排开。然后我们看全连接层,下图自上向下是3个全连接层的输出结果:

全连接层的结果

我们再来看卷积核的可视化结果。第一个卷积层的卷积核图像如下图所示:

     卷积层1的卷积核

可以看到,这些卷积核确实是在提取边缘,方向等信息。再看第2个卷积层的卷积核:

卷积层2的卷积核

看上去很杂乱,没有反应太多信息。有没有更好的办法?答案是肯定的,目前出现了一些文章解决卷积层可视化的问题。在这里,我们介绍一种典型的方法,通过反卷积运算将卷积核的效果可视化出来。

文献[1]设计了一种用反卷积操作可视化卷积层的方案。具体做法是,将卷积网络学习到的特征图像左乘产生这些特征图像对应的卷积核的转置矩阵,将图片特征从特征图像空间投影到像素空间,以发现是哪些像素激活了特定的特征图像,达到分析理解卷积网络的目的。这这操作称为反卷积,也叫转置卷积

对于卷积层,在反卷积运算时使用正向传播时的卷积核的转置矩阵对特征图像进行卷积,将特征图像还原到原始的像素图像空间得到重构的图像。通过反卷积操作得到卷积核的可视化图像如下图所示:

     通过反卷积进行可视化

上图表明,前面的层提取的特征比较简单,是一些颜色、边缘特征。越往后的卷积层提取的特征越复杂,是一些复杂的几何形状。这符合我们对卷积神经网络的设计初衷,即通过多层卷积完成对图像的逐层特征提取和抽象。

另外一种分析卷积网络机理的方法是根据卷积结果图像直接重构原始输入图像,如果根据卷积结果可以重构出原始输入图像,则说明卷积网络很大程度上保留了图像的信息。文献[2]设计了一种方法,通过卷积网络提取出来的特征反向表示图像来观察卷积网络的表达能力。在这里,反向表示是指由卷积网络编码后的向量近似重构原始输入图像。具体做法是给定卷积网络编码后的向量,寻找一张图像,这种图像通过卷积网络编码之后的向量与给定向量最匹配,这通过求解一个最优化问题实现。下图是根据卷积输出结果重构出来的图像:

卷积图像重构

其中,上面一行是原始图像,下面一行是重构后的图像。从这个结果可以看出,卷积神经网络确实提取出了图像的有用信息。

参考文献:

[1] Zeiler M D, Fergus R. Visualizing and Understanding Convolutional Networks. European Conference on Computer Vision, 2013.

[2] Aravindh Mahendran, Andrea Vedaldi. Understanding Deep Image Representations by Inverting Them. CVPR 2015.

 

 

2019-05-30 23:43:32 Europe233 阅读数 982

\quad图像处理之中,有很多算法是基于卷积的:图像滤波、边缘提取都是对整幅图像做了一个卷积。由于图像是离散的,所以实际上是图像矩阵和一个卷积模板做了卷积操作。通常滤波的卷积模板权值和为1(因为滤波其实是在取均值),边缘提取的模板权值和为0(因为是在做差分)。

\quad为什么会用到卷积呢?因为在这里用卷积,会具有空不变性,或者说,具有一种空间上的平移不变性。假设原图像为f(i,j)f(i,j),卷积模板是S(i,j)S(i,j),以O(i,j)O(i,j)表示(i,j)(i,j)的领域,卷积后的图像是g(i,j)g(i,j):
g(i,j)=(t,k)O(i,j)f(t,k)S(it,jk)g(i,j)={\sum\sum}_{(t,k)\in O(i,j)}f(t,k)S(i-t,j-k)\quad上面提到的空不变性是指:对于原图像中的每个像素点,都进行了同样的操作,都以同一个卷积模板套在这个像素点上,对其领域内所有像素点的灰度值进行加权求和。当中心像素点滑动,卷积模板也会跟着滑动,始终保证中心像素点在卷积模板的中心。

\quad再说一些关于卷积的东西,上面的卷积具有空不变性,如果卷积是这个形式:
t0tef(s)g(ts)ds\int_{t_0}^{t_e} f(s)g(t-s)ds其中的t代表时间,就表示这个形式的卷积具有时不变性,或者有一种时间上的平移不变性。对于函数f的所有点,它们在时间维度上受到了同样的操作。这一点很难表达,可以看这个链接中的例子:

【如何通俗易懂地解释卷积? - palet的回答 - 知乎
https://www.zhihu.com/question/22298352/answer/637156871】
\quad这个回答中对于“卷积”一词的理解也非常有趣:“先卷再积”,实在生动形象。

2017-12-20 18:24:02 y12345678904 阅读数 9702

设输入图像尺寸为W,卷积核尺寸为F,步幅为S,Padding使用P,经过该卷积层后输出的图像尺寸为WF+2PS+1

2017-04-16 21:30:53 yjl9122 阅读数 161229

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

卷积层

用它来进行特征提取,如下:


输入图像是32*32*3,3是它的深度(即R、G、B),卷积层是一个5*5*3的filter(感受野),这里注意:感受野的深度必须和输入图像的深度相同。通过一个filter与输入图像的卷积可以得到一个28*28*1的特征图,上图是用了两个filter得到了两个特征图;

我们通常会使用多层卷积层来得到更深层次的特征图。如下:



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



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

如上图,完成卷积,得到一个3*3*1的特征图;在这里还要注意一点,即zero pad项,即为图像加上一个边界,边界元素均为0.(对原输入无影响)一般有

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

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


这里写图片描述

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


如没有这个原则,则特征图由10个32*32*1的特征图组成,即每个特征图上有1024个神经元,每个神经元对应输入图像上一块5*5*3的区域,即一个神经元和输入图像的这块区域有75个连接,即75个权值参数,则共有75*1024*10=768000个权值参数,这是非常复杂的,因此卷积神经网络引入“权值”共享原则,即一个特征图上每个神经元对应的75个权值参数被每个神经元共享,这样则只需75*10=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函数


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

  • Tanh函数


    这里写图片描述

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

  • ReLU函数


    这里写图片描述

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

    优点:
    ∙ x>0 时,梯度恒为1,无梯度耗散问题,收敛快;
    ∙ 增大了网络的稀疏性。当x<0 时,该层的输出为0,训练完成后为0的神经元越多,稀疏性越大,提取出来的特征就约具有代表性,泛化能力越强。即得到同样的效果,真正起作用的神经元越少,网络的泛化性能越好
    ∙ 运算量很小;
    缺点:
    如果后层的某一个梯度特别大,导致W更新以后变得特别大,导致该层的输入<0,输出为0,这时该层就会‘die’,没有更新。当学习率比较大时可能会有40%的神经元都会在训练开始就‘die’,因此需要对学习率进行一个好的设置。
    由优缺点可知max(0,x) 函数为一个双刃剑,既可以形成网络的稀疏性,也可能造成有很多永远处于‘die’的神经元,需要tradeoff。

  • Leaky ReLU函数


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

  • Maxout函数


    这里写图片描述

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

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

池化层

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


这里写图片描述

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


这里写图片描述

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


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

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

  • 一般池化(General Pooling)

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

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


    这里写图片描述

    最常见的池化操作为平均池化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扩展到任意大小的图像
    这里写图片描述

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


    这里写图片描述
    对于不同的图像要得到相同大小的pooling结果,就需要根据图像的大小动态的计算池化窗口的大小和步长。假设conv5输出的大小为a*a,需要得到n*n大小的池化结果,可以让窗口大小sizeX为,步长为 。下图以conv5输出的大小为13*13为例。

全连接层

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

总的一个结构大致如下:
这里写图片描述