大家好啊,我是董董灿!
在很多与计算机视觉相关的神经网络中,我们往往都会看到池化这一算法,它一般跟在卷积层后面。
神经网络中用到最多的池化方式无外乎是最大池化和平均池化。两者运算接近,区别在于是在kernel范围内取最大值还是取平均值来作为池化的输出。
那池化的本质是什么呢?为什么在神经网络中,尤其是CNN网络中,会需要用到池化算法呢?
1、池化的本质
先回顾下池化运算。
下图展示的是一个最大池化的计算过程。它利用一个2x2的核(kernel)来圈定一次池化的计算范围,每次选定输入图片中2x2范围内的最大值数值作为输出。
这一过程非常简单,它计算的每一步,就是从选定的范围内,计算出一个数字来,这一过程也叫做特征的聚合(aggregation)。
我们知道,卷积的输出是特征图,特征图的一个通道代表一个特征。
而针对特征图的池化操作在每个通道上是独立进行的,池化前后特征图变化的仅仅是长宽方向的尺寸。
那怎么理解特征聚合呢?
举个例子。
最大池化的每次计算,都是选取kernel范围内的最大值作为这个范围内最显著的特征代表。
一张图片中,像素值最大的地方,往往是图像突变最大的地方,比如图像的轮廓和边缘,因此最大池化,可以有效的提取图像的轮廓边缘信息。
也就是说,通过最大池化,输出了一个比原始图像在长宽方向尺寸更小的图片,但这个更小的图片却聚合了原始图像中最显著的轮廓和边缘特征。
达到了特征聚合的目的,这也是池化算法的本质。
围绕着这个本质,可以引申出几个池化算法的优势。
2、池化的优势
减少计算量
输出的图片在长宽方向上尺寸变小了,从而带来了计算量的减少,这一点是显而易见的。
减少过拟合的风险
计算量的减少,带来的另一个显著影响就是池化层后面的神经网络需要处理的特征图尺寸变小了,从而使得模型的参数量需求减少。
参数越少,过拟合的风险越低,这一点在训练过程中尤为重要。
提高模型对图片平移、缩放和旋转等变换的鲁棒性
之前看到这句话的时候,有点似懂非懂。后来查了一些资料,发现这句话说的其实是池化算法对于原始图片的变换具有轻微的容忍度。
也就是说,有了池化算法,模型可以容忍输入的图像有轻微的旋转、平移或者缩放,可以在不改变任何模型算法或结构的情况下,希望推理出正确的结果。
举个例子。
下面的图片示意了最大池化对于图片轻微旋转的容忍度。
如果输入图片有轻微的旋转,经过最大池化,只要图片旋转的角度不是很厉害,依旧可以在对应位置获取到目标区域中的最大值12。
而对于图片的平移和缩放变换,池化算法同样有着类似的轻微容忍度。
注意这里一直在说是轻微的容忍度。如果一张图片旋转、平移过多,那么经过池化输出的结果肯定是不一样的,这时模型推理的结果可能也就不一样了。
正是因为这几个优势,使得池化操作经常会出现在CNN网络中。
好了,关于池化就写到这,不知看完之后,你对池化这一算法是否有了更深的认识了呢?