感知野多用于目标识别,没看过这方面论文和工作,所以理解出错希望大家可以立刻指正。
感知野定义:
在卷积神经网络中,感受野的定义是卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。
看图理解:
上图左边5*5 (kernel_size k=3x3,padding_size p=1x1, stride s = 2x2)
输出3*3的特征,右图是尺寸不变的特征分布,看到输入层3*3的区域对应第一层(绿色)的一个特征点。即第一层的像素点在原始图片上映射大小是3*3.同理,再经过(kernel_size k=3x3,padding_size p=1x1, stride s = 2x2)输出第二层(黄色)的特征大小为2*2,看到第二层的像素点在原始图片上映射大小是7*7.
上面的数据仅是从图片上得到的,大致对感知野有了直观上的理解,就是这一层的特征是由输入的哪些特征的集合或者说与哪些输入特征有关,理解感知就是说这一层的特征能够看到即感知到输入的哪一块(部分)。
那么层数越深,不断卷积特征越来越小,其对应的感知野越大。
如何计算?
以VGG16为例:卷积为3*3,stride=1,pool为2*2,stride=2,RF为感知野大小。
说法1:关于感受野大小的计算采用top to down的方式, 即先计算最深层在前一层上的感受野,然后逐渐传递到第一层,使用的公式可以表示如下:
RF = 1 #待计算的feature map上的感受野大小
for layer in (top layer To down layer):
RF = ((RF -1)* stride) + fsize
stride 表示卷积的步长; fsize表示卷积层滤波器的大小
RF1=(1-1)×1+3=3
RF2=(3-1)×1+3=5
RF3=(5-1)×1+2=6
RF4=(6-1)×2+3=13
RF5=(13-1)×2+3=27
和结果不符合,也不太理解top to down是什么意思?从深层到浅层计算?如何计算?
说法2:
当前感受野size:r
相邻特征的距离(jump):j
左上角feature的中心坐标:start
rout
r
o
u
t
就是所求的感知野,重点在于
rin
r
i
n
和
jin
j
i
n
的计算。
下面来算一算:
卷积为3*3,stride=1,pool为2*2,stride=2,RF为感知野大小。
第一层
rin
r
i
n
=1,
jin
j
i
n
=1
jout
j
o
u
t
=1*1=1
rout
r
o
u
t
=
rin
r
i
n
+
(k−1)
(
k
−
1
)
*
jin
j
i
n
=1+(3-1)*1=3
第二层
rin
r
i
n
=3,
jin
j
i
n
=1
jout
j
o
u
t
=1*1=1
rout
r
o
u
t
=
rin
r
i
n
+
(k−1)
(
k
−
1
)
*
jin
j
i
n
=3+(3-1)*1=5
第三层pool
rin
r
i
n
=5,
jin
j
i
n
=1
jout
j
o
u
t
=
jin
j
i
n
×
s
s
=1*2=2
=
rin
r
i
n
+
(k−1)
(
k
−
1
)
*
jin
j
i
n
=5+(2-1)*1=6
第四层
rin
r
i
n
=6,
jin
j
i
n
=2
jout
j
o
u
t
=
jin
j
i
n
×
s
s
=2*1=2
=
rin
r
i
n
+
(k−1)
(
k
−
1
)
*
jin
j
i
n
=6+(3-1)*2=10
第五层
rin
r
i
n
=10,
jin
j
i
n
=2
jout
j
o
u
t
=
jin
j
i
n
×
s
s
=2*1=2
=
rin
r
i
n
+
(k−1)
(
k
−
1
)
*
jin
j
i
n
=10+(3-1)*2=14
第六层pool
rin
r
i
n
=14,
jin
j
i
n
=2
jout
j
o
u
t
=
jin
j
i
n
×
s
s
=2*2=4
=
rin
r
i
n
+
(k−1)
(
k
−
1
)
*
jin
j
i
n
=14+(2-1)*2=16
第七层
rin
r
i
n
=16,
jin
j
i
n
=4
jout
j
o
u
t
=
jin
j
i
n
×
s
s
=4*1=4
=
rin
r
i
n
+
(k−1)
(
k
−
1
)
*
jin
j
i
n
=16+(3-1)*4=24
…..
最后一层pool
rin
r
i
n
=196,
jin
j
i
n
=16
jout
j
o
u
t
=
jin
j
i
n
×
s
s
=16*2=32
=
rin
r
i
n
+
(k−1)
(
k
−
1
)
*
jin
j
i
n
=196+(2-1)*16=212
以ALEXNET为例子:[11,4,0]表示kernel size,stride,pad
根据公式
第一层
rin
r
i
n
=1,
jin
j
i
n
=1
jout
j
o
u
t
=1*4=4
rout
r
o
u
t
=
rin
r
i
n
+
(k−1)
(
k
−
1
)
*
jin
j
i
n
=1+(11-1)*1=11
第二层
rin
r
i
n
=11,
jin
j
i
n
=4
jout
j
o
u
t
=4*2=8
rout
r
o
u
t
=
rin
r
i
n
+
(k−1)
(
k
−
1
)
*
jin
j
i
n
=11+(3-1)*4=19
第三层pool
rin
r
i
n
=19,
jin
j
i
n
=8
jout
j
o
u
t
=
jin
j
i
n
×
s
s
=8*2=16
=
rin
r
i
n
+
(k−1)
(
k
−
1
)
*
jin
j
i
n
=19+(5-1)*8=51
….
最后一层pool
rin
r
i
n
=355,
jin
j
i
n
=32
jout
j
o
u
t
=
jin
j
i
n
×
s
s
=32*1=32
=
rin
r
i
n
+
(k−1)
(
k
−
1
)
*
jin
j
i
n
=355+(1-1)*32=355
也可计算出下式(图是别人的,我自己算了一遍)
总结:由第二种计算方法得到正确的感知野数目。两种计算方法并不相等。不知到1的出处是哪里?
附:
https://stackoverflow.com/questions/35582521/how-to-calculate-receptive-field-size
1) It is the size of the area of pixels that impact the output of the last convolution.
2) For each convolution and pooling operation, compute the size of the output. Now find the input size that results in an output size of 1x1. Thats the size of the receptive field