如何理解CNN中的感受野(receptive-field)以及如何计算感受野?

本文转载自博客园用户 @shine-lee的彻底搞懂感受野的含义与计算。

1. 感受野(Receptive-Field, RF)是什么?

The receptive field is defined as the region in the input space that a particular CNN's feature is looking at (i.e. be affected by). 来自 A guide to receptive field arithmetic for Convolutional Neural Networks

在卷积神经网络中,感受野的定义是:卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。

卷积神经网络中,越深层的神经元看到的输入区域越大,如下图所示,kernel size 均为3×3,stride均为1,绿色标记的是 [公式] 每个神经元看到的区域,黄色标记的是 [公式] 看到的区域,具体地,[公式]每个神经元可看到[公式]上3×3大小的区域,[公式]每个神经元看到[公式]上3×3大小的区域,该区域可以又看到[公式]上5×5大小的区域。

所以,感受野是个相对概念,某层feature map上的元素看到前面不同层上的区域范围是不同的,通常在不特殊指定的情况下,感受野指的是看到输入图像上的区域。

为了具体计算感受野,这里借鉴视觉系统中的概念, [公式]

准确计算感受野,需要回答两个子问,即视野中心在哪和视野范围多大

  • 只有看到”合适范围的信息”才可能做出正确的判断,否则就可能“盲人摸象”或者“一览众山小”;
  • 目标识别问题中,我们需要知道神经元看到是哪个区域,才能合理推断物体在哪以及判断是什么物体。

但是,网络架构多种多样,每层的参数配置也不尽相同,感受野具体该怎么计算?

2. 计算感受野的大小

在正式计算之前,先对数学符号做如下约定,

  • [公式] :kernel size,卷积核大小;
  • [公式] :padding size,填充大小;
  • [公式] :stride size,步长大小;
  • Layer:用Layer表示feature map,特别地 [公式] 为输入图像;
  • Conv:用Conv表示卷积,k、p、s为卷积层的超参数, [公式] 的输入和输出分别为 [公式][公式]
  • [公式] :feature map size为 n×n,这里假定height=width;
  • [公式] :receptive field size为r×r,这里假定感受野为方形;
  • [公式] :feature map上相邻元素间的像素距离,即将feature map上的元素与输入图像 [公式] 上感受野的中心对齐后,相邻元素在输入图像上的像素距离,也可以理解为 feature map上前进1步相当于输入图像上前进多少个像素,如下图所示,feature map上前进1步,相当于输入图像上前进2个像素,j=2;
  • [公式] :feature map左上角元素在输入图像上的感受野中心坐标(start,start),即视野中心的坐标,在上图中,左上角绿色块感受野中心坐标为(0.5,0.5),即左上角蓝色块中心的坐标,左上角白色虚线块中心的坐标为(−0.5,−0.5);
  • [公式][公式] 表示层,卷积层为 [公式] ,其输入feature map为[公式],输出为[公式]

下面假定所有层均为卷积层,其他操作如池化,空洞卷积等可以等价于普通卷积层:

  1. 对于空洞卷积dilated convolution,相当于改变了卷积核的尺寸,若含有dilationrate参数,只需将 [公式] 替换为 [公式] ,dilationrate=1时为正常卷积;
  2. 对于pooling层,可将其当成特殊的卷积层,同样存在kernel size、padding、stride参数。
  3. 非线性激活层为逐元素操作,不改变感受野。

2.1 感受野大小的计算

感受野大小的计算是个递推公式:

再看上面的动图,如果feature map [公式]上的一个元素A看到feature map [公式] 上的范围为3×3(图中绿色块),其大小等于kernel size [公式],所以,A看到的感受野范围[公式]等价于[公式]上3×3窗口看到的[公式]范围,据此可以建立起相邻Layer感受野的关系,如下所示,其中[公式][公式]的感受野,[公式][公式]的感受野:

  • [公式] 一个元素的感受野[公式]等价于[公式] 上k×k 个感受野的叠加;
  • [公式] 上一个元素的感受野为[公式]
  • [公式] 上连续k 个元素的感受野可以看成是,第1个元素看到的感受野加上剩余k−1步扫过的范围[公式] 上每前进1个元素相当于在输入图像上前进[公式]个像素,结果等于[公式]+(k−1)×[公式]

可视化如下图所示:

下面的问题是, [公式] 怎么求?

[公式]上前进1个元素相当于[公式]上前进[公式]个元素,转换成像素单位为:

其中,[公式][公式]的kernel在[公式] 上滑动的步长,输入图像的 [公式]

根据递推公式可知,

[公式] 上前进1个元素,相当于在输入图像前进了 [公式] 个像素,即前面所有层stride的连乘。进一步可得, [公式] 的感受野大小为:

2.2 计算感受野中心大小

感受野中心的计算也是个递推公式:

在上一节中计算得[公式],表示feature map [公式] 上前进1个元素相当于在输入图像上前进的像素数目,如果将feature map上元素与感受野中心对齐,则 [公式] 为感受野中心之间的像素距离。如下图所示,

其中,各层的kernel size、padding、stride超参数已在图中标出,右侧图为feature map和感受野中心对齐后的结果。

相邻Layer间,感受野中心的关系为:

所有的start坐标均相对于输入图像坐标系。其中, [公式] ,为输入图像左上角像素的中心坐标, [公式] 表示 [公式] 左上角元素的感受野中心坐标, [公式][公式][公式] 感受野中心相对于 [公式] 坐标系的偏差,该偏差需折算到输入图像坐标系,其值需要乘上 [公式] ,即 [公式] 相邻元素间的像素距离,相乘的结果为 [公式] ,即感受野中心间的像素距离——相对输入图像坐标系。至此,相邻Layer间感受野中心坐标间的关系就不难得出了,这个过程可视化如下。

3. 总结

感受野的计算公式:

由上面的递推公式,就可以从前向后逐层计算感受野了,代码可参见computeReceptiveField.py,在线可视化计算可参见Receptive Field Calculator

最后,还有几点需要注意:

  • [公式] 的感受野大小与 [公式][公式] 无关,即当前feature map元素的感受野大小与该层相邻元素间的像素距离无关;
  • 为了简化,通常将padding size设置为kernel的半径,即 [公式] ,可得 [公式] ,使得feature map [公式][公式] 位置的元素,其感受野中心坐标为 [公式]
  • 对于空洞卷积dilated convolution,相当于改变了卷积核的尺寸,若含有dilationrate参数,只需将 [公式] 替换为 [公式] ,dilationrate=1时为正常卷积;
  • 对于pooling层,可将其当成特殊的卷积层,同样存在kernel size、padding、stride参数。
  • 非线性激活层为逐元素操作,不改变感受野。

[1][2]

参考

  1. ^彻底搞懂感受野的含义与计算 https://www.cnblogs.com/shine-lee/p/12069176.html
  2. ^SIGAI-关于感受野的总结 https://zhuanlan.zhihu.com/p/40424530
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值