感受野指的是特征图上的某个点在输入空间所受影响的区域。一个感受野可以用中心位置(center location)和大小(size)来表征。
公式1:
N o u t = ⌊ N i n + 2 p − k s ⌋ + 1 N_{out} = \lfloor \frac{N_{in}+2p -k}{s}\rfloor+1 Nout=⌊sNin+2p−k⌋+1
其中:
N o u t N_{out} Nout :输出特征图尺寸
N i n N_{in} Nin : 输入图像或特征图尺寸
k , p , s k,p,s k,p,s :分别为卷积核尺寸、padding 大小、滑动步长
例如:一个 5 x 5
的图像,使用3 x 3
的卷积核,步长为1,padding 为 0 ,
那么输出结果为:3 x 3
的特征图。
import torch
input = torch.rand(1, 1, 5, 5)
print(input.shape)
conv1 = torch.nn.Conv2d(1, 1, kernel_size=3, stride=1, padding=0)
conv2 = torch.nn.Conv2d(1, 1, kernel_size=3, stride=1, padding=1)
out1 = conv1(input)
out2 = conv2(input)
print(out1.shape)
print(out2.shape)
N o u t = ⌊ N i n + 2 p − k s ⌋ + 1 N_{out} = \lfloor \frac{N_{in}+2p -k}{s}\rfloor+1 Nout=⌊sNin+2p−k⌋+1
1 、计算输出特征图的特征间的间隔 j j j
j o u t = j i n ∗ s j_{out} = j_{in}*s jout=jin∗s
s s s 为卷积的步长,
其等于上一层的间隔值乘以卷积的步长,所以间隔值将是按照步长呈指数级增长。
2 、计算输出特征图的感受野大小
r o u t = r i n + ( k − 1 ) ∗ j i n r_{out} = r_{in}+(k-1)*j_{in} rout=rin+(k−1)∗jin
r i n r_{in} rin是前一层感受野大小 , k k k为卷积核大小所以感受野是呈指数级增加。
3 、计算输出特征图的第一个特征感受野的中心坐标
s t a r t o u t = s t a r t i n + ( k − 1 2 − p ) ∗ j i n start_{out} = start_{in}+(\frac{k-1}{2}-p)*j_{in} startout=startin+(2k−1−p)∗jin
两项都要乘以前一层的间隔距离以得到实际距离。
计算实例:
如下图,Layer 0
为输入层,大小 5 x 5
,感受野大小r0 = 1
, 特征间隔j0 = 1
,start = 0.5
(中心点坐标)
使用k = 3, p=1, s=2
进行卷积操作,
N o u t = ⌊ 5 + 2 ∗ 1 − 3 2 ⌋ + 1 = 3 N_{out} = \lfloor \frac{5+2*1-3}{2}\rfloor+1 = 3 Nout=⌊25+2∗1−3⌋+1=3
得到 3 x 3
的输出特征图Layer 1
那么 r1 = 1 * 2 = 2
, j1 = 1 + (3 - 1) * 1 = 3
start1 = 0.5 + [(3 - 1) / 2 - 1] * 1 = 0.5
关于感受野大小的计算方式是采用从最后一层往下计算的方法,即先计算最深层在前一层上的感受野,然后逐层传递到第一层,使用的公式可以表示如下:
r i = ( r i + 1 − 1 ) ∗ s i + k i r_{i} = (r_{i+1} - 1) * s_i+k_i ri=(ri+1−1)∗si+ki
其中, r i r_i ri是第 i i i层卷积层的感受野, r i + 1 r_{i+1} ri+1是 i + 1 i+1 i+1层上的感受野,s是卷积的步长,k是本层卷积核的大小。