深度学习感受野计算公式推导(前向/反向详解)

Receptive Field

感受野指的是一个特定的特征图上的某个点在输入空间所受影响的区域。

forward

从浅层往深层计算。

示意图说明:

​图中共有三层,图像层img,第一层map1,第二层,map2。为了方便推导,我们使用一维卷积进行演示。一个正方框表示一个像素点,长条状的就是卷积核,为了清楚的分辨出卷积核移动的位置,做了颜色差别处理和长宽放大。箭头所指的是经过这次卷积后产生的图像。

rf

符号定义:

l : l a y e r 特 征 图 层 次 r l : 第 l 层 感 受 野 大 小 k l : 第 l 层 卷 积 核 大 小 s l : 第 l 层 卷 积 步 长 \begin{aligned} &l:layer特征图层次\\ &r_l:第l层感受野大小 \\ &k_l:第l层卷积核大小 \\ &s_l:第l层卷积步长 \\ \end{aligned} l:layerrl:lkl:lsl:l

f i r s t = { k 1 = 4 s 2 = 3 s e c o n d = { k 2 = 3 s 1 = 1 \begin{aligned} first= \begin{cases} k_1=4 \\ s_2=3 \end{cases} \\ second= \begin{cases} k_2=3 \\ s_1=1 \end{cases} \end{aligned} first={ k1=4s2=3second={ k2=3s1=1
第一层卷积核fisrt大小为4,步长为3,第二层卷积核second大小为3,步长为1。

规定 r 0 = 1 r_0=1 r0=1表示图像层的感受野大小为1。推导过程中,大家可以自行发挥推导过层,其中我们可以用手动数来验证我们的推导公式是否正确。

r 1 r_1 r1表示第一层,即map1层。第一层感受野大小为4。显然:
r 1 = k 1 = 4 r_1=k_1=4 r1=k1=4

r 2 r_2 r2表示第二层,即map2层。第二层感受野大小为10。显然:
r 2 ≠ k 2 = 3 r_2\neq k_2=3 r2=k2=3
显然:
r 2 ≠ k 2 ∗ k 1 = 12 r_2 \neq k_2*k_1=12 r2=k2k1=12
当我们计算第二层 r 2 r_2 r2时,看图!感受野大小与第二层卷积核(k=3) 将 第一层map1中套起来的三个像素有关。可这三个像素在img层中涉及到的像素有重叠的。所以不能直接所不能简单的使卷积核的相乘。


第i层和i-2层的关系

接下来,我将解析如何将感受野与卷积核建立联系,此推导过程可类比于输出图像的计算公式推导。

计算 r 2 r_2 r2,就是计算第二层map2上一个紫框包含几个img层的方框。

首先,我们看到第二层的一个紫框在第一层map1上包括的范围。其个数为第二层卷积核的大小 k 2 k_2 k2

然后我们把感受野大小计算公式分解为:首项+其他项

既然上面提到有重叠,那我们利用首项+其他项的思想去重叠。

首项计算:map1中的第一个蓝框作为首项,单独拿出来,它所占的感受野大小为 k 1 k_1 k1

其他项:map1中第二红框,第三绿框作为其他项,一共 ( k 2 − 1 ) (k_2-1) (k21)个框。每个框在img上的包裹的像素大小为步长 s 1 s_1 s1,(黄色虚线之间)。这样计算是没有重叠的。总共包括的感受野大小为: ( k 2 − 1 ) ∗ s 1 (k_2-1)*s_1 (k21)s1

综上:
r 2 = ( k 2 − 1 ) ∗ s 1 + k 1 r_2=(k_2-1)*s_1+k_1 r2=(k21)s1+k1
此时我们建立了,第 i i i层和第 i − 2 i-2 i2层的关系。即第二层map2一个方框在图像层img包含的像素的个数。

第三层:
r 3 = ( k 3 − 1 ) ∗ s 2 + k 2 r_3=(k_3-1)*s_2+k_2 r3=(k31)s2+k2

重新回顾下,计算第二层的 r 2 r_2 r2在img层的包含像素个数时,利用的是第二层卷积核 k 2 k_2 k2在第一层map1包含方框的个数,一共包含 k 2 k_2 k2个。

此时我们根据上述 r 3 r_3 r3公式,知道了第三层map3在第一层map1中包含的方框的个数。

将第三层map3在map1中的个数( r 3 r_3 r3个)替换 r 2 r_2 r2中的个数 k 2 k_2 k2,即可得到第三层map3在img图像上包含的像素的个数。
即第三层感受野大小:
r 3 = ( ( ( k 3 − 1 ) ∗ s 2 + k 2 ) − 1 ) ∗ s 1 + k 1 r_3=\big(((k_3-1)*s_2+k_2)-1 \big)*s_1 + k_1 r3=(((k31)s2+k2)1)s1+k1


第i层和第i-1层的关系

建立第i层和第i-1层的关系。

联立 r 2 , r 3 r_2,r_3 r2,r3,消去 k 1 k_1 k1,得到
{ r 2 = ( k 2 − 1 ) ∗ s 1 + k 1 r 3 = ( ( ( k 3 − 1 ) ∗ s 2 + k 2 ) − 1 ) ∗ s 1 + k 1 ⟹ r 3 = ( k 3 − 1 ) ∗ s 2 ∗ s 1 + r 2 \begin{aligned} &\begin{cases} r_2=(k_2-1)*s_1+k_1 \\ r_3=\big(((k_3-1)*s_2+k_2)-1 \big)*s_1 + k_1 \end{cases} \\ \Longrightarrow & \quad r_3=(k_3-1)*s_2*s_1 + r_2 \end{aligned} { r2=(k21)s1+k1r3=(((k31)s2+k2)1)s1+k1r3=(k31)s2s1+r2

归纳:
{ r 1 = k 1   ,   k = 1 r l = ( k l − 1 ) s l − 1 ∗ s l − 2 ∗ ⋯ ∗ s 1 + r l − 1   ,   k > 1 \begin{cases} r_1=k_1 \ , \ k=1\\ r_l=(k_l-1)s_{l-1}*s_{l-2}*\cdots *s_1 +r_{l-1} \ , \ k>1 \end{cases} { r1=k1 , k=1rl=(kl1)sl1sl2s1+rl1 , k>1
s 0 = 1 , r 0 = 1 s_0=1,r_0=1 s0=1,r0=1,则:
r l = ( k l − 1 ) ∏ i = 0 l − 1 s i + r l − 1 r_l=(k_l-1)\prod_{i=0}^{l-1}s_i + r_{l-1} rl=(kl1)i=0l1si+rl1
由推导过程和结果,我们可以观察到以下结论:

a)感受野大小与滤波器大小和之前所有层卷积核步长有关系;

b)计算感受野大小时,与padding的大小无关,即图像边缘填充无影响。

backward

倒推,从深层往浅层递推。

符号定义:
{ R ( l , i ) : 表 达 第 l 层 在 第 i 层 上 感 受 野 大 小 , 其 中 i < l 。 R ( l , 0 ) : 表 示 第 l 层 在 图 像 上 的 感 受 野 大 小 k l : 第 l 层 卷 积 核 大 小 s l : 第 l 层 卷 积 步 长 \begin{cases} R(l,i):表达第l层在第i层上感受野大小,其中i<l。\\ R(l,0):表示第l层在图像上的感受野大小 \\ k_l:第l层卷积核大小 \\ s_l:第l层卷积步长 \\ \end{cases} R(l,i):lii<lR(l,0):lkl:lsl:l

rf


首先,在自身特征图上的感受野大小为1,即 R ( 2 , 2 ) = 1 R(2,2)=1 R(2,2)=1

map2在map1上包含像素的大小很简单,一眼就看出是卷积核大小
R ( 2 , 1 ) = k 2 = 3 R(2,1)=k_2=3 R(2,1)=k2=3

但map2在img图像上包含像素的大小却并不是直接卷积核相乘。

同样,我们再利用首项+其他项的数学思想。可以得到。

首项个数始终为1,其他项个数为 R ( 2 , 1 ) − 1 R(2,1)-1 R(2,1)1.其中首项大小为当前感受野大小,其他项为步长。

即可得到map2在img上感受野大小。
R ( 2 , 0 ) = ( R ( 2 , 1 ) − 1 ) ∗ s 1 + k 1 = ( 3 − 1 ) ∗ 3 + 4 = 10 \begin{aligned} R(2,0) &=(R(2,1) -1)*s_1 + k_1 \\ &=(3-1)*3+4 \\ &=10 \end{aligned} R(2,0)=(R(2,1)1)s1+k1=(31)3+4=10

归纳:
R ( l , l − 1 ) = k l R ( l , l − 2 ) = ( R ( l , l − 1 ) − 1 ) ∗ s l − 1 + k l − 1 R ( l , l − 3 ) = ( R ( l , l − 2 ) − 1 ) ∗ s l − 2 + k l − 2 ⋯ ⋯ R ( l , 0 ) = ( R ( l , 1 ) − 1 ) ∗ s 1 + k 1 \begin{aligned} &R(l,l-1)=k_l\\ &R(l,l-2)=(R(l,l-1)-1)*s_{l-1}+k_{l-1} \\ &R(l,l-3)=(R(l,l-2)-1)*s_{l-2}+k_{l-2} \\ & \cdots \cdots \\ &R(l,0)=(R(l,1)-1)*s_1+k_1 \end{aligned} R(l,l1)=klR(l,l2)=(R(l,l1)1)sl1+kl1R(l,l3)=(R(l,l2)1)sl2+kl2R(l,0)=(R(l,1)1)s1+k1
证明上面第一项 R ( l , l − 1 ) R(l,l-1) R(l,l1)也符合通项公式。
∵ R ( l , l ) = 1 ∴ ( R ( l , l ) − 1 ) ∗ s l = 0 ∴ R ( l , l − 1 ) = ( R ( l , l ) − 1 ) ∗ s l + k l \begin{aligned} & \because R(l,l)=1 \\ & \therefore (R(l,l)-1)*s_l=0 \\ &\therefore R(l,l-1)=(R(l,l)-1)*s_l+k_l \end{aligned} R(l,l)=1(R(l,l)1)sl=0R(l,l1)=(R(l,l)1)sl+kl
综上,我们得到一个从后往前迭代的一个数列,可以计算 l l l层在图像层上的感受野大小。
首 项 : R ( l , l ) = 1 递 推 公 式 : R ( l , l − 1 ) = ( R ( l , l ) − 1 ) ∗ s l + k l \begin{aligned} &首项:R(l,l)=1 \\ &递推公式:R(l,l-1)=(R(l,l)-1)*s_l+k_l \end{aligned} R(l,l)=1R(l,l1)=(R(l,l)1)sl+kl

代码实现:

R=1
for layer in range(layers,0,-1):
    R = (R - 1) * stride[layer] + fsize[layer]

猜你喜欢

转载自blog.csdn.net/weixin_43356770/article/details/124373791
今日推荐