一、感受野的概念
感受野指的是一个特定的 CNN 特征(特征图上的某个点)在输入空间所受影响的区域。
感受野计算时有下面的几个情况需要说明:
a)第一层卷积层的输出特征图像素的感受野的大小等于滤波器的大小;
b)深层卷积层的感受野大小和它之前所有层的滤波器大小和步长有关系;
c)计算感受野大小时,忽略了图像边缘的影响,即不考虑padding的大小。
二、感受野计算公式
1.公式一:
从原始input出发,逐层迭代到最后输出:
l
k
=
l
k
−
1
+
[
(
f
k
−
1
)
∗
∏
i
=
1
k
−
1
s
i
]
l_{k} = l_{k-1}+ \left [ (f_{k}-1)*\prod_{i=1}^{k-1}s_{i} \right ]
lk=lk−1+[(fk−1)∗i=1∏k−1si]
其中
l
k
−
1
l_{k-1}
lk−1 为第
k
−
1
k-1
k−1 层对应的感受野大小,
f
k
f_k
fk 为第
k
k
k 层的卷积核大小,或者是池化层的池化尺寸大小。
举个例子
感受野的计算是逐层进行的,以下表中的网络结构为例。
No. | Layers | Kernel Size | Stride |
---|---|---|---|
1 | Conv1 | 3*3 | 1 |
2 | Pool1 | 2*2 | 2 |
3 | Conv2 | 3*3 | 1 |
4 | Pool2 | 2*2 | 2 |
5 | Conv3 | 3*3 | 1 |
6 | Conv4 | 3*3 | 1 |
7 | Pool3 | 2*2 | 2 |
感受野初始值
l
0
=
1
l_0 = 1
l0=1,每层的感受野计算过程如下:
l
0
=
1
l_0 = 1
l0=1
l
1
=
1
+
(
3
−
1
)
=
3
l_1 = 1 + (3-1) = 3
l1=1+(3−1)=3
l
2
=
3
+
(
2
−
1
)
∗
1
=
4
l_2 = 3 + (2-1)*1 = 4
l2=3+(2−1)∗1=4
l
3
=
4
+
(
3
−
1
)
∗
1
∗
2
=
8
l_3 = 4 + (3-1)*1*2 = 8
l3=4+(3−1)∗1∗2=8
l
4
=
8
+
(
2
−
1
)
∗
1
∗
2
∗
1
=
10
l_4 = 8 + (2-1)*1*2*1 = 10
l4=8+(2−1)∗1∗2∗1=10
l
5
=
10
+
(
3
−
1
)
∗
1
∗
2
∗
1
∗
2
=
18
l_5 = 10 + (3-1)*1*2*1*2 = 18
l5=10+(3−1)∗1∗2∗1∗2=18
l
6
=
18
+
(
3
−
1
)
∗
1
∗
2
∗
1
∗
2
∗
1
=
26
l_6 = 18 + (3-1)*1*2*1*2*1 = 26
l6=18+(3−1)∗1∗2∗1∗2∗1=26
l
7
=
26
+
(
2
−
1
)
∗
1
∗
2
∗
1
∗
2
∗
1
∗
1
=
30
l_7 = 26 + (2-1)*1*2*1*2*1*1 = 30
l7=26+(2−1)∗1∗2∗1∗2∗1∗1=30
2.公式二:
根据top to down的方式,即从网络的最后向前推
感受野的大小是由kernel size(filter)和stride size(步长)一起决定的,
公式:
rfsize = f(out, stride, ksize) = (out - 1) * stride + ksize,其中out是指上一层感受野的大小,stride是当前层stride
最后一层可带也可不带入公式,它的out是前一层的ksize
举刚才那个例子:
out7 = (1-1)*2 +2 =2
out6 = (2-1)*1 + 3 = 4
out5 = (4-1)*1 + 3 = 6
out4 = (6-1)*2 + 2 = 12
out3 = (12-1)*1 + 3 = 14
out2 = (14-1)*2 + 2 = 28
out1 = (28-1)*1 + 3 = 30
out7是第7层输出相对于第7层输入也就是第6层输出的感受野,out6是第7层输出相对于第6层输入也就是第5层输出的感受野,以此类推,out1是第7层输出相对于第1层输入也就是第0层输出的感受野,也就是相对于input_image的感受野。