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为膨胀率。换成等效卷积核后再套用以上方法计算感受野即可。