基础概念

在图像处理中,由于图像中存在较多冗余信息,可用某一区域子块的统计信息(如最大值或均值等)来刻画该区域中所有像素点呈现的空间分布模式,以替代区域子块中所有像素点取值,这就是卷积神经网络中池化(pooling)操作。

池化操作对卷积结果特征图进行约减,实现了下采样,同时保留了特征图中主要信息。比如:当识别一张图像是否是人脸时,我们需要知道人脸左边有一只眼睛,右边也有一只眼睛,而不需要知道眼睛的精确位置,这时候通过池化某一片区域的像素点来得到总体统计特征会显得很有用。

池化的几种常见方法包括:平均池化、最大池化、K-max池化。

  • 平均池化: 计算区域子块所包含所有像素点的均值,将均值作为平均池化结果。如 下图(a),这里使用大小为2×2的池化窗口,每次移动的步幅为2,对池化窗口覆盖区域内的像素取平均值,得到相应的输出特征图的像素值。池化窗口的大小也称为池化大小,用 k h × k w k_h×k_w kh×kw表示。在卷积神经网络中用的比较多的是窗口大小为2×2,步幅为2的池化。
  • 最大池化: 从输入特征图的某个区域子块中选择值最大的像素点作为最大池化结果。如下图(b),对池化窗口覆盖区域内的像素取最大值,得到输出特征图的像素值。当池化窗口在图片上滑动时,会得到整张输出特征图。

  • K-max池化: 对输入特征图的区域子块中像素点取前K个最大值,常用于自然语言处理中的文本特征提取。如下图所示,从包含了4个取值的每一列中选取前2个最大值就得到了K最大池化结果。

特点

1、当输入数据做出少量平移时,经过池化后的大多数输出还能保持不变,因此,池化对微小的位置变化具有鲁棒性。例如下图中,输入矩阵向右平移一个像素值,使用最大池化后,结果与平移前依旧能保持不变。

2、由于池化之后特征图会变小,如果后面连接的是全连接层,能有效的减小神经元的个数,节省存储空间并提高计算效率。

池化中填充的方式

int输入

int输入即接收一个int类型的数字n,对图片的四周包裹n行n列的0来填充图片。如果要保持图片尺寸不变,n的值和池化窗口的大小是有关的。假如 H i n 、 W i n H_{in}、W_{in} HinWin 为图片输入的大小, k h , k w k_h, k_w kh,kw 为池化窗口的大小, H o u t , H o u t H_{out}, H_{out} Hout,Hout 为结果图的大小的话,他们之间有着这样的关系。 H o u t = H i n + 2 p h − k h s h + 1 W o u t = W o u t + 2 p w − k w s w + 1 H_{out} = \frac{H_{in} + 2p_h – k_h}{s_h} + 1 \ W_{out} = \frac{W_{out} + 2p_w -k_w}{s_w} + 1 Hout=shHin+2phkh+1Wout=swWout+2pwkw+1 在使用3×3的池化窗口且步长为1的情况下,还要保持图片大小不变,则需要使用padding=1的填充。 那么,公式就变为了 H o u t = 6 − 3 + 21 1 + 1 W o u t = 6 − 3 + 21 1 + 1 H_{out} = \frac{6 – 3 + 21}{1} + 1 \ W_{out} = \frac{6 – 3 + 21}{1} + 1 Hout=163+21+1Wout=163+21+1 另外,在stride不为1且不能被整除的情况下,整体结果向下取整。 关于Padding和K的公式如下 P a d d i n g = ( k − 1 ) 2 ( k % 2 ! = 0 ) Padding = \frac{(k-1)}{2} \quad \quad (k\%2 != 0) Padding=2(k1)(k%2!=0)这是池化中不padding,stride为1的结果,可以根据公式填入, H o u t = W o u t = ( 6 + 0 − 3 ) + 1 = 4 H_{out} = W_{out} = (6 + 0 – 3) + 1 = 4 Hout=Wout=(6+03)+1=4,因此池化后的结果为4。如果填充呢?

正如我们上面的公式, H o u t = W o u t = ( 6 + 2 − 3 ) + 1 = 6 H_{out} = W_{out} = (6 + 2 – 3) + 1 = 6 Hout=Wout=(6+23)+1=6, 填充为1的时候图像保持为原大小。

list和tuple输入

因为图像有宽和高,所以list和tuple的长度应该为2,里面的两个值分别对应了高和宽,计算方式和上面int输入的一样,单独计算。一般用作输入图片宽高不一致,或者池化窗口大小不一的情况。

string输入

string输入有两个值,一个是SAME,一个是VALID。这两个的计算公式如下:

SAME: H o u t = ⌈ H i n s h ⌉ H_{out} = \lceil \frac{H_{in}}{s_h} \rceil Hout=shHin, W o u t = ⌈ W i n s w ⌉ W_{out} = \lceil\frac{W_{in}}{s_w}\rceil Wout=swWin

VALID: H o u t = H i n − k h s h + 1 H_{out} = \frac{H_{in} – k_h}{s_h} + 1 Hout=shHinkh+1, W o u t = W i n − k w s w + 1 W_{out} = \frac{W_{in} – k_w}{s_w} + 1 Wout=swWinkw+1

可以看到,VALID方式就是默认采用的不填充的方式,与上面不Padding的公式一样。而SAME则与池化窗口的大小无关,若 s h s_h sh s w s_w sw为1,无论池化窗口的大小,输出的特征图的大小都与原图保持一致。当任意一个大于1时,如果能整除,输出的尺寸就是整除的结果,如果不能整除,则通过padding的方式继续向上取整。