感受野详解

目录

  • 概念
  • 举例
  • 感受野的计算规律
  • 两种计算感受野的方法
    • 从前往后
    • 从后往前
  • 推导VGG16网络的感受野
    • 结构
    • 从后往前
    • 从前往后
  • 感受野大于图片
  • 为什么要增大感受野

概念

  • 在卷积神经网络中,感受野(Receptive Field)的定义是卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小。再通俗点的解释是,特征图上的一个点对应输入图上的区域,如图1所示。
    感受野详解_第1张图片
  • 在典型CNN结构中,FC层每个输出节点的值都依赖FC层所有输入,而CONV层每个输出节点的值仅依赖CONV层输入的一个区域, 这个区域之外的其他输入值都不会影响输出值,该区域就是感受野。

举例

  • 两层3*3的卷积核卷积操作之后的感受野是5*5,其中卷积核(filter)的步长(stride)为1、padding为0,如图所示:
    感受野详解_第2张图片
  • 三层3*3卷积核操作之后的感受野是7*7,其中卷积核的步长为1,padding为0,如图所示:
    感受野详解_第3张图片

感受野的计算规律

  • 设感受野为r(即r为一个元素映射到输入图像的正方形矩阵的边长,这里假设卷积核为正方形,所以映射也是正方形),s为步长,s1表示步长=1,s2表示步长=2,k为卷积核尺寸。
  • 初始feature map的感受野是1,即 r 0 = 1 r_{0}=1 r0=1,很明显嘛,输入图像还没有经过任何操作,每个元素的感受野当然是1。
  • 规定初始s是1,即 s 0 = 1 s_{0}=1 s0=1
  • 每经过一个conv k*k s,感受野按照如下公式变化: r i + 1 = r i + ( k i + 1 − 1 ) ∗ ∏ n = 0 i s n r_{i+1}=r_{i}+(k_{i+1}-1)*\displaystyle\prod_{n=0}^{i} s_{n} ri+1=ri+(ki+11)n=0isn
    一定要注意这个公式最后的连乘,我自己推公式的时候以为不是连乘而是 s i s_{i} si,其实是是不对的。因为很多博客的推导感受野公式的思路和我不一样,直到看到这篇博客是用的连乘我才意识到自己推导的公式的错误所在。博客链接:https://www.cnblogs.com/ocean1100/p/9864193.html
  • 由上述公式可知, r 1 = k 1 r_{1}=k_{1} r1=k1必然成立,也就是说,第一层的感受野必然等于卷积核的尺寸,这与已知符合。
  • 池化操作和卷积操作都对应上面的公式,其实仔细想想,池化和卷积其实是很相似的。
  • 上述公式是从前往后计算感受野的公式,而从后往前计算感受野可以用下面这个公式:
    r i − 1 = ( r i − 1 ) ∗ s i − 1 + k i − 1 r_{i-1}=(r_{i}-1)*s_{i-1}+k_{i-1} ri1=(ri1)si1+ki1
    此时最后一层感受野的大小=卷积核的大小,其实这种方法的原理就是倒过来看问题,你想最后一层感受野就像是细胞,模拟细胞分裂的过程, + k i − 1 +k_{i-1} +ki1其实是从 r i r_{i} ri中取出1来,这个细胞其实是由前一层卷过来的,卷积核尺寸是 k i − 1 k_{i-1} ki1,所以要加 k i − 1 k_{i-1} ki1,而 剩 下 的 r i 剩下的r_{i} ri,即 r i − 1 r_{i}-1 ri1个感受野则是对应步长的。其实文字不太好叙述,大家需要好好理解一下,从后往前的好处就是不用计算s的叠乘了,不过这对于计算机来说并不是什么难事,从后往前是一种反向思维,我个人感觉从前往后更好理解一些。
  • 特殊情况,经过conv1x1 s1不会改变感受野,经过FC层和GAP层,感受野就是整个输入图像
  • 经过多分枝的路径,按照感受野最大支路计算,shotcut也一样所以不会改变感受野
  • ReLU, BN,dropout等元素级操作不会影响感受野
  • 全局步进等于经过所有层的步进累乘,即 ∏ n = 0 i s n \displaystyle\prod_{n=0}^{i} s_{n} n=0isn
  • 经过的所有层所加padding都可以等效加在输入图像,等效值P,直接用卷积的输入输出公式
    f o u t = ( f i n − k + 2 ∗ p ) / s + 1 f_{out}=(f_{in}-k+2*p)/s+1 fout=(fink+2p)/s+1
    反推出P即可

两种计算感受野的方法

从前往后

  • 我们来计算一个简单的例子,先学会计算感受野,再来分析复杂的网络。
    感受野详解_第4张图片
    根据上面的规律,我们可以计算:
    r 0 = 1 , s 0 = 1 r_{0}=1,s_{0}=1 r0=1s0=1
    r 1 = 3 r_{1}=3 r1=3
    r 2 = 3 + ( 2 − 1 ) ∗ 1 = 4 r_{2}=3+(2-1)*1=4 r2=3+(21)1=4(r2即对应pool1层)
    r 3 = 4 + ( 3 − 1 ) ∗ 2 = 8 r_{3}=4+(3-1)*2=8 r3=4+(31)2=8
    r 4 = 8 + ( 2 − 1 ) ∗ 2 = 10 r_{4}=8+(2-1)*2=10 r4=8+(21)2=10(r4即对应pool2层)
    r 5 = 10 + ( 3 − 1 ) ∗ 4 = 18 r_{5}=10+(3-1)*4=18 r5=10+(31)4=18
    r 6 = 18 + ( 3 − 1 ) ∗ 4 = 26 r_{6}=18+(3-1)*4=26 r6=18+(31)4=26(r6即对应conv4层)
    r 7 = 26 + ( 2 − 1 ) ∗ 4 = 30 r_{7}=26+(2-1)*4=30 r7=26+(21)4=30

从后往前

  • 我们从最后一层的池化层开始计算感受野:
    p o o l 3 : R = 2 ( 最 后 一 层 池 化 层 输 出 特 征 图 的 感 受 野 大 小 等 于 卷 积 核 的 大 小 ) pool3:R=2(最后一层池化层输出特征图的感受野大小等于卷积核的大小) pool3R=2
    c o n v 4 : R = ( 2 − 1 ) ∗ 1 + 3 = 4 。 conv4:R=(2-1)*1+3=4。 conv4R=211+3=4
    c o n v 3 : R = ( 4 − 1 ) ∗ 1 + 3 = 6 。 conv3:R=(4-1)*1+3=6。 conv3R=411+3=6
    p o o l 2 : R = ( 6 − 1 ) ∗ 2 + 2 = 12 。 pool2:R=(6-1)*2+2=12。 pool2R=612+2=12
    c o n v 2 : R = ( 12 − 1 ) ∗ 1 + 3 = 14 。 conv2:R=(12-1)*1+3=14。 conv2R=1211+3=14
    p o o l 1 : R = ( 14 − 1 ) ∗ 2 + 2 = 28 。 pool1:R=(14-1)*2+2=28。 pool1R=1412+2=28
    c o n v 1 : R = ( 28 − 1 ) ∗ 1 + 3 = 30 。 conv1:R=(28-1)*1+3=30。 conv1R=2811+3=30

推导VGG16网络的感受野

结构

感受野详解_第5张图片

从后往前

在VGG16中:pool5中
pool5:RF=2
conv5_3 :RF=(2-1)*1+3=4
conv5_2 : RF=(4-1)*1+3=6
conv5_2: RF=(6-1)*1+3=8
conv5_1: RF=(8-1)*2+2=16
pool4 : RF=(8-1)*2+2=16
conv4_3: RF=(16-1)*1+3=18
conv4_2: RF=(18-1)*1+3=20
conv4_1 : RF=(20-1)*1+3=22
pool3: RF=(22-1)*2+2=44
conv3_3: RF=(44-1)*1+3=46
conv3_2: RF=(46-1)*1+3=48
conv3_1: RF=(48-1)*1+3=50
pool2: RF=(50-1)*2+2=100
conv2_2: RF=(150-1)*1+3=152
conv2_1: RF=(152-1)*1+3=154
pool1: RF=(154-1)*2+2=208
conv1_2: RF=(208-1)*1+3=210
conv1_1: RF=(210-1)1+3=212

从前往后

conv1_1: RF=3
conv1_2: RF=3+(3-1)*1=5
pool1: RF=5+(2-1)*1=6
conv2_1: RF=6+(3-1)*2=10

后面的数在上图的栏目里都有了,我就不一一计算了,最终结果也是212

感受野大于图片

  • 感受野大于图片怎么理解呢?其实是由于存在padding操作导致的。padding操作对于感受野的意义就相当于扩大图片。扩大后的尺寸可以用我在规律里最后一条提到的公式去计算,相当于去掉所有步骤中的padding操作去计算实际的图片尺寸,这个没有什么意义……只要知道为啥感受野大于图片就好了。

为什么要增大感受野

  • 卷积、池化都有一个重要作用就是增大感受野,为什么感受野这么重要呢?
  • 前面看过感受野的定义,是表示在前几层对应的图像区域的大小,那么为了保证所利用的信息是全局的,而不仅仅是局部信息,我们就应该保证感受野较大。同时,合理计算感受野,可以保证效率,例如,输入图像大小是128*128,如果最后一层的感受野已经可以超过128,我们可以认为在做最后的分类判断时所用到的特征已经涵盖了原始图像所有范围的信息了。如果能够尽可能的降低网络的参数总量,也十分重要。

你可能感兴趣的:(算法,卷积,感受野,计算机视觉)