常见的池化层

它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效地原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。

cnn池化层和卷积层的关系 cnn池化层的作用_cnn池化层和卷积层的关系

池化的作用:

池化操作后的结果相比其输入缩小了。池化层的引入是仿照人的视觉系统对视觉输入对象进行降维和抽象。在卷积神经网络过去的工作中,研究者普遍认为池化层有如下三个功效:

  1.特征不变性:池化操作是模型更加关注是否存在某些特征而不是特征具体的位置。其中不变形性包括,平移不变性、旋转不变性和尺度不变性。

平移不变性是指输出结果对输入对小量平移基本保持不变,例如,输入为(1, 5, 3), 最大池化将会取5,如果将输入右移一位得到(0, 1, 5),输出的结果仍将为5。对伸缩的不变形,如果原先的神经元在最大池化操作后输出5,那么经过伸缩(尺度变换)后,最大池化操作在该神经元上很大概率的输出仍是5.

  2.特征降维(下采样):池化相当于在空间范围内做了维度约减,从而使模型可以抽取更加广范围的特征。同时减小了下一层的输入大小,进而减少计算量和参数个数。

  3.在一定程度上防止过拟合,更方便优化。

        4.实现非线性(类似relu)。

        5.扩大感受野。

常见的池化层:

(1)最大池化、平均池化、全局平均池化、全局最大池化。

平均池化(average pooling):计算图像区域的平均值作为该区域池化后的值。

最大池化(max pooling):选图像区域的最大值作为该区域池化后的值。

(2)重叠池化(OverlappingPooling):

重叠池化就是,相邻池化窗口之间有重叠区域,此时一般sizeX > stride

(3)空金字塔池化(Spatial Pyramid Pooling)

空间金字塔池化的思想源自 Spatial Pyramid Model,它将一个pooling变成了多个scale的pooling。用不同大小池化窗口作用于上层的卷积特征。也就是说 spatital pyramid pooling layer就是把前一卷积层的feature maps的每一个图片上进行了3个卷积操作,并把结果输出给全连接层。其中每一个pool操作可以看成是一个空间金字塔的一层。

cnn池化层和卷积层的关系 cnn池化层的作用_cnn池化层和卷积层的关系_02

这样做的好处是,空间金字塔池化可以把任意尺度的图像的卷积特征转化成相同维度,这不仅可以让CNN处理任意尺度的图像,还能避免cropping和warping操作,导致一些信息的丢失,具有非常重要的意义。

最大池化和平均池化的区别:

特征提取中误差主要来自两个方面:1)邻域大小受限造成的估计值方差增大;(2)卷积层参数误差造成估计均值的偏移

一般来说,mean-pooling能减小第一种误差(邻域大小受限造成的估计值方差增大),更多的保留图像的背景信息,max-pooling能减小第二种误差(卷积层参数误差造成估计均值的偏移),更多的保留纹理信息。Stochastic-pooling则介于两者之间,通过对像素点按照数值大小赋予概率,再按照概率进行亚采样,在平均意义上,与mean-pooling近似,在局部意义上,则服从max-pooling的准则。

pytorch实现

torch.nn.functional.avg_pool2d(input, kernel_size, stride=None, 
    padding=0, ceil_mode=False, count_include_pad=True)

池化层的反向传播:

1. 平均池化

mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变,还是比较理解的,图示如下 

 

cnn池化层和卷积层的关系 cnn池化层的作用_cnn池化层和卷积层的关系_03

2. 最大池化

max pooling也要满足梯度之和不变的原则,max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。所以max pooling操作和mean pooling操作不同点在于需要记录下池化操作时到底哪个像素的值是最大,也就是max id。源码中有一个max_idx_的变量,这个变量就是记录最大值所在位置的,因为在反向传播中要用到,那么假设前向传播和反向传播的过程就如图所示。

cnn池化层和卷积层的关系 cnn池化层的作用_池化_04

无论max pooling还是mean pooling,都没有需要学习的参数。因此,在卷积神经网络的训练中,Pooling层需要做的仅仅是将误差项传递到上一层,而没有梯度的计算。

(1)max pooling层:对于max pooling,下一层的误差项的值会原封不动的传递到上一层对应区块中的最大值所对应的神经元,而其他神经元的误差项的值都是0;

(2)mean pooling层:对于mean pooling,下一层的误差项的值会平均分配到上一层对应区块中的所有神经元。