神经网络的感受野
神经网络的感受野
关于的神经网络感受野,最直观的一个理解是:当我们通过卷积、池化等操作获得一个特征图以后,这张特征图上的一个特征点(一个像素),受到了原输入图像上多大范围内像素的影响。感受野事实上反映了当前用来对输入图像进行描述的特征,究竟能够涵盖到输入图像上多大范围内的信息。
在研究中表明,理论感受野所覆盖的像素,对于一个CNN特征来说,并不是同等重要,而是越靠近感受野中心的像素产生的影响越大,呈指数级聚焦。
这表明了理论感受野和模型的实际感受野存在的差异性。尽管如此,在实际的任务中,我们仍然可以利用理论感受野进行估算。当想要检出的目标在原图上具有较大尺度的时候,应该尤其注意模型的设计是否符合目标所需的感受野大小。
一、感受野的计算
下图给出了感受野可视化的两种方式。
左边一列直接从卷积运算的角度出发,来直观计算两层卷积之后特征的感受野大小。第一层输入图像大小为 5×5,卷积核大小 k = 3×3,步长 s = 2,padding = 1x1。第一层卷积之后图像的为 3×3,根据卷积的计算方法,第一层特征图(绿色)的感受野为 3×3。接下来第二层卷积采用完全相同的设置,假设padding部分也按完全相同的方式进行卷积,找到参与第二层卷积计算的所有第一层特征图像素,分析其各自的感受野范围,则可以得到第二层特征图(黄色)感受野为 7×7。
右边一列则固定了感受野的中心。其推算方法与前面相同,只是在标注感受野时在不同层的特征图上对齐到了各自中心位置。在这列图中,每个特征(绿色、黄色方块),被标记到了其感受野所在的中心位置。
感受野的计算则可以按下述公式递推进行:
- 计算本层输出特征图大小 ,其中 为上一层特征图大小,p 为单侧的padding大小,k为卷积核尺寸,s为步长。
- 计算本层特征的感受野中心的间隔 。其中 为上一层的特征间隔,s为卷积步长。
- 计算本层感受野大小 ,其中 为上一层特征的感受野大小,即本层感受野大小为上一层感受野大小加上一个附加项,这个附加项按s呈指数级增加。
- 计算本层特征图第一个特征在原图上的感受野中心的坐标。
下面给出前面的感受野可视化图的计算实例。
下面给出感受野计算的通项公式,十分简洁易用:
其中 为本层感受野,为上一层感受野,为当前卷积核大小,为第i层的步长。该通项公式和前述计算本质相同。池化过程和卷积同理。总的来看,当前感受野大小同时受到前层感受野的大小、卷积/池化核的大小与步长影响。
二、如何增大模型的感受野
以检测任务为例,对任务数据集进行初步评估时,其中一步是应检查其尺寸分布情况,确保所使用的模型的感受野能够覆盖到我们想要检出的最大目标。(注意,当数据图像尺寸不一时,应该统计的是目标占所在图像的比例,因为多数情况下图像送入网络之后需要resize到统一尺寸。)
选定经典网络作为backbone时,若计算发现理论感受野不足,可以考虑以下方案:
- 选择更深的backbone
- 缩小图像的训练尺度
- 在网络局部使用空洞卷积(DeepLabv1和《Multi-scale context aggregation by dilated convolutions》中提出)
- 引入DCN模块(实验上来看,在coco等大型检测数据集上预训练过的dcn比自己在小数据集上训练的要好,这个模块比较难训练)
这里给出空洞卷积感受野的计算方法:
可以首先计算出其实际卷积核大小,设空洞率为 r,原始卷积核大小为 k,则空洞卷积的实际卷积核大小 。接下来可用上述通项公式计算感受野。
上面绿色方块表示当前层的感受野,颜色越深表示被覆盖的次数越多。上述三种卷积方式的计算量是相同的,但是感受野却不同。空洞卷积能够在不增加计算量的情况下,增加模型的感受野。当使用多个空洞卷积构成多层网络时,有效感受野呈指数级增长,而所需参数量仅仅呈线性增长。它在分割等任务中用于获取多尺度的上下文信息,并且不会丢失分辨率(传统卷积增大感受野往往伴随着步长增加)。
空洞卷积存在的问题:
- gridding effect,损失了信息的连续性
- 有利于大目标识别,对小目标却不友好
有效感受野问题:
前面推断了理论感受野,主要根据是当前特征的计算受到了输入图像上多大范围内像素的影响。而计算过程中可以发现,输入图像上的有的像素被使用到了多次,而边缘的某些像素使用较少。也就是说,虽然理论感受野范围内的像素都对当前特征产生影响,但影响的重要成程度却不同,这就是有效感受野,它呈高斯分布从中心到边缘快速衰减。
参考文献:
[2] 空洞卷积总结 (gridding问题及其解决方法)
[3] CNN真的需要下采样/上采样吗 (关于空洞卷积的一些有趣实验)