x o u t = x i n − k s + 1 x_{out} = \frac{x_{in} - k}{s} + 1 xout=sxin−k+1
如果不考虑padding,卷积输出的feature map的计算公式如上,那么 x i n = ( x o u t − 1 ) ∗ s + k x_{in} = (x_{out} - 1) * s + k xin=(xout−1)∗s+k。因此计算模型的感受野可以从最后一层往前推。下面举个例子说明:
图片来自于https://paddlepedia.readthedocs.io/en/latest/tutorials/CNN/convolution_operator/Convolution.html
一个输入大小为6x6的图像经过两层大小为3x3的卷积核之后,输出特征图变为2x2。现在要计算输出的这个特征图上的每个点对应输入的6x6的图像上多大范围的像素点(感受野)。很直观的,输出的2x2图像上每个点来自于中间特征图的3x3区域。即:
x i n = ( x o u t − 1 ) ∗ s − k = ( 2 − 1 ) × 1 + 3 = 3 x_{in} = (x_{out} - 1)*s - k = (2 - 1)\times 1 + 3 = 3 xin=(xout−1)∗s−k=(2−1)×1+3=3
那么中间的特征图上点影响多大范围的来自第一个特征图像素点?类似的过程代入以上公式:
x i n = ( x o u t − 1 ) ∗ s + k = ( 3 − 1 ) ∗ 1 + 3 = 5 x_{in} = (x_{out} - 1) * s + k = (3 - 1) * 1 + 3 = 5 xin=(xout−1)∗s+k=(3−1)∗1+3=5
因此我们得到输出的2x2的特征图上的点对应于原始特征图上5x5范围的像素点,即感受野为5x5。池化层的感受的计算同上。如果是遇到空洞卷积的感受野计算,可以先把空洞卷积转换成等效的卷积核 (参考: 直观理解Dilated Convolution)
空洞卷积的等效卷积核大小为 k ′ = k + ( k − 1 ) ( d − 1 ) = d ( k − 1 ) + 1 k' = k + (k-1)(d-1) = d(k-1)+1 k′=k+(k−1)(d−1)=d(k−1)+1,其中d为膨胀率。换成等效卷积核后再套用以上方法计算感受野即可。