转自:cnn中的感受野
作者:山涧一壶酒


一、定义

One of the basic concepts in deep CNNs is the receptive field, or field of view, of a unit in a certain layer in the network. Unlike in fully connected networks, where the value of each unit depends on the entire input to the network, a unit in convolutional networks only depends on a region of the input. This region in the input is the receptive field for that unit.【1】

简单来说就是卷积神经网络(CNN)中每层的卷积特征图(feature map)上的像素点在原始图像中映射的区域大小,也就相当于高层的特征图中的像素点受原图多大区域的影响。

如图1-1是三层的神经卷积神经网络(为了方便,将二维简化为一维),每一层卷积核的kernel_size=3, stride=1,那么最上层特征所对应的感受野就为如图所示紫色区域的7x7。

二、感受野的计算

感受野的计算方式有两种,一种是自上而下,即:从输入层到输出层依次计算每层的感受野;另一种是自下而上,即:从输出层逐层反推到原图得到该输出层的感受野。下面一一介绍:

统一符号表达方式:其中RF_k表示第k层的感受野,f_k表示第k层的kernel size,s_k表示第k层的stride。

  • 自下而上,如公式(1),其中 RF_0=1:

这种计算方式有一个网站可以方便的验证,见参考文献[2]。

  • 自下而上,如公式(2),其中第一个计算层的 RF_k 为 f_k:

这种计算方式有方便运行的开源代码可以验证,见参考文献[3]。

公式推倒见参考文献[4]。

以VGG16为例,如图2-1为用两种方式计算的感受野,左边白色区域为网络结构,黄色区域使用公式(1)计算得到的各个层的感受野大小,绿色区域使用公式(2)计算得到各个层的感受野大小,两种方式计算得到的感受野一致。

随着网络结构的不断变化,除了常用的conv、pooling、relu、dropout,目前还有bn、dilation-conv、deconv、upsampling等操作,以及网络结构中的多路合并(如resblock,inceptionblock,denseblock)等,这些操作计算感受野的规则如下:

  • bn、relu、dropout不影响感受野
  • dilation-conv,使用公式(3)计算出实际的卷积核大小,其中d为dilation值,再使用公式(1)或者公式(2)计算感受野
  • deconv,表示反卷积(或者trans conv),会改变感受野,与普通卷积计算感受野方式相同
  • 多路合并取最大:即多路合并之后的感受野与感受野最大的分支的感受野相等
  • upsampling:一般通过插值来实现。感受野受参与插值计算的像素数的影响。如:对于双线性插值,会有4个像素参与计算,感受野的计算与一个kernel size为2,stride为1的卷积计算方式相同。(Upsampling is frequently done using interpolation (e.g., bilinear, bicubic or nearest-neighbor methods), resulting in an equal or larger receptive field — since it relies on one or multiple features from the input. Upsampling layers generally produce output features which depend locally on input features, and for receptive field computation purposes can be considered to have a kernel size equal to the number of input features involved in the computation of an output feature.[4]。)

目前CNN网络中常用的layer的感受野的计算规则介绍完了,可以尝试计算一下常用网络的最大感受野,看看与下图2-2是否相同。

三、理论感受野vs有效感受野

公式(1)和公式(2)计算的感受野都是理论感受野(RF),从图2-2可以看出,最大的理论感受野轻轻松松覆盖全图;而且,当你的网络结构确定了,理论感受野也就是个定值了。那天天的调参数,训模型,都是为了达到什么效果?其中很重要的一点就是得到比较好的有效感受野(effective receptive field,ERF)。从直觉上,有效感受野有以下3个特点:

  1. 有效感受野比理论感受野小
  2. 有效感受野上限是输入图像大小
  3. 初始化的模型,有效感受野很小

定性分析

其实,已经有人定性的分析了有效感受野[1],一起学习一下论文的发现。

1,有效感受野区域是类高斯分布的,如图3-1

2,理论感受野,随着网络变深,以

倍增长,有效感受野占理论感受野的比例以
倍衰减,其实也就是说有效感受野的真实大小没怎么变。如图3-2.

3,下采样和dialtion卷积会提高有效感受野,如图3-3。

4,训练会提高有效感受野范围,如图3-4.

5,合理的权重初始化,可以提高感受野和加速收敛。具体方法如下:

Practically, we can initialize the network with any initialization method, then scale the weights according to a distribution that has a lower scale at the center and higher scale on the outside[1]。

6,使用非矩形窗口的卷积,如deformable convolution。

一点点定量分析

有效感受野和网络结构、网络参数都是相关的,因此只有当网络训练好的时候才方便分析感受野情况。这里介绍一种简单的用于分析有效感受野范围的数据驱动的方法。步骤如下:

1,确定待分析的对象,以及该对象在卷积神经网络的每一层对应的激活区域,即:输入图像中的对象在所有网络层的特征图;

2,我们需要知道该对象的哪些区域对特征图的激活区域影响较大:具体操作就是在该对象的图像区域中,随机掩盖某些小区域,如:对11x11的范围置0,从而我们得到n张带有一个被掩盖小区域的图像;

3,将n张图像以及原图送入网络中计算得到每层的特征图,对比有掩盖区域的图像与原始图像在激活区域激活分值的变化,如果激活分值差异明显的,就说明掩盖的区域很重要。统计n张图中该对象的差异位置分布,构建差异分布图。该差异分布图即为有效感受野范围。

如图3-5,是使用该方式计算出来的有效感受野范围。从有效感受野的变化来看,该网络已经学习的很好了,随着网络的加深,有效感受野也逐步变大。

四、总结

现在的CNN网络都比较深,输出层有足够大的理论感受野,有能力表达出不同尺度的目标。但是真正对目标起作用的是有效感受野,而有效感受野是远小于理论感受野的,所以大部分的目标检测网络,其实只是看到了目标的一小部分,然后去预测整个目标大小。但是,实验也证明,在网络训练过程中,实际感受野也增大,所以好的网络设计、训练参数会增大有效感受野,对达成任务目标很有帮助。

有效感受野占理论感受野很小的一部分,也就是在层层卷积以及非线性计算过程中,有效感受野很难与离中心很远处的目标位置产生联系,即:更多的保留了局部信息。所以这也是为什么我们在做目标检测和分割以及一些识别任务时,需要考虑如何给网络加入上下文信息。从这里看,还是为了增大有效感受野。

总之,我们在修改现成的网络时,感受野也可以对网络的设计提供一些思路。如:在参数不增加的前提下,使用dilation conv;为了将增大浅层特征的感受野,考虑使用fpn。

参考文献:

【1】Understanding the Effective Receptive Field in Deep Convolutional Neural Networks

【2】https://fomoro.com/research/article/receptive-field-calculator

【3】https://github.com/google-research/receptive_field

【4】Computing Receptive Fields of Convolutional Neural Networks

更多文章:

目标检测中的Anchor分析

7天,搞定机器学习的基础知识

在springcacheinvokecontext中没找到field_CNN中的感受野相关推荐

  1. 在springcacheinvokecontext中没找到field_家庭中没入住多久玻璃胶就发黑发霉,终于找到它的原因了,很简单...

    装修是每个家庭必须要走的流程,也是一件微不足道的小问题.在装修的过程中有很多的小细节是我们要注意,隐藏起来的和明面上摆着的这些细节都要重视起来,把这些小细节全部做好,你就能感觉到原来装修也非常简单. ...

  2. 在springcacheinvokecontext中没找到field_【干!货!】源于经验,所以惊艳——八猴中风格化角色展示一篇搞定,羡慕你们有这么干货的图文教程!...

    雕刻和建模 高模在ZBrush中从头部开始雕刻 雕刻风格化角色从原始形状开始,而不使用现成模型修改,优点:允许反复试验剪影和比例 大量参考资料 贴图 SP中绘制贴图,PBR特性下实现手绘风格外观 模型 ...

  3. linux删除文件夹提示没找到,Win10中遇到删除文件夹提示找不到该项目的解决过程...

    今天删一文件夹,结果提示找不到该项目,百度找到的解决方法如下: 方法一:rd /s /q 被删除文件夹路径 方法二:360文件粉碎器 经测试以上方法全部无效,又试了下面的方法 方法一:下载powert ...

  4. 黄聪:DEDECMS联动调用时提示“你设定了字段为联动类型,但系统中没找到与你定义的字段名相同的联动组名!”...

    出现这个情况是由于: 系统管理目录下mychannel_field_edit.php文件第62行: 复制代码 if($dtype=='stepselect') 在stepselect后缺少$符号,修改 ...

  5. 阿里P8高级架构师:面试没你想象中的难,拿Offer也可以很轻松

    阿里P8高级架构师:面试没你想象中的难,拿Offer也可以很轻松 一.概述 面试,难还是不难?取决于面试者的底蕴(技能).心态和认知及沟通技巧.面试其实可以理解为一场聊天和谈判,在这过程中有心理.思想 ...

  6. vc2005编译过程中没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题? 的彻底解决

    vc2005编译过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的彻底解决 收藏 快毕业了,为了工作的需要,需要使用庞大的VS2 ...

  7. ME2N标准报表中加EKKO/EKPO中没显示的字段

    用户提出要在ME2N/ME2M/ME2W/ME3M里加EKKO/EKPO中没显示的字段: 1.现是在结构MEREP_OUTTAB_PURCHDOC里APPEND字段就可以了. SE11中显示结构:ME ...

  8. matlab 连通域数量,【Matlab】找到矩阵中每个连通域的最小值

    [Matlab]找到矩阵中每个连通域的最小值 [Matlab]找到矩阵中每个连通域的最小值 连通域在我浅薄的图像处理知识中,一直是很神圣的存在.最近想在Matlab里实现的时候,发现竟然一个函数就解决 ...

  9. win10 设备管理器中没端口选项解决方法

    win10 设备管理器中没端口选项是怎么回事? 解决方法: 被隐藏了,点击上面的查看,勾选显示隐藏的设备就可以找到端口了 转载来源:https://zhidao.baidu.com/question/ ...

  10. Redis过期策略,如何找到redis中所有过期的key

    提问:如何找到redis中所有过期的key? 这个问题,我也只想到了一种办法,如果有其他比较好的方案,热烈欢迎评论区一展风采哈~ 先说说Redis的删除策略. 1.定时删除 在创建key的时候,为ke ...

最新文章

  1. Excel如何设置单元格行高,办公入门
  2. JAVA调用R语言之Rserve
  3. ios 静态库冲突的解决办法
  4. C#中父子窗口之间实现控件互操作
  5. 无插件web直播解决方案,ffmpeg+nginx-http-flv-module+flv.js
  6. Python语言规范
  7. 猛然发现,已经第100篇随笔了
  8. 在MyEclipse中更换或修改svn的用户名和密码
  9. uniitest怎么传参数
  10. 页面头部title、description、keywords标签的优化
  11. 99%的人都不知道的鸡兔同笼解法!
  12. 老生常谈之CSS的垂直居中
  13. 排序算法专题-归并排序
  14. return、break、continue三者的区别
  15. win10如何更改计算机开机界面,win10怎么修改开机画面_win10开机画面怎么换
  16. 计算机主机显示接口,一文了解电脑视频接口 看完彻底明白了
  17. 【esp32-s3】6.1 文件系统——spi挂载tf卡
  18. java源程序的运行命令_Java源程序名为Test.java,运行它的Java程序的命令是( )。 (10.0分)_学小易找答案...
  19. 解释一下label中的写法:plt.plot(t, sig, b-, linewidth=2, label=r$\sigma(t) = \frac{1}{1 + e^{-t}}$)...
  20. 插件电容时间久了_揭秘电解电容存放久了会怎样,电容放置时间过长怎么办?

热门文章

  1. ubuntu 12.04 下安装 PyTesser 进行OCR识别 - 从波 - 博客园
  2. OSPF在企业网络中的应用
  3. 批处理禁用U盘,光驱,用户添加到组,盘符添加权限
  4. Android流媒体
  5. 剑指offer、按之字形打印二叉树(python)
  6. 计算机应用基础三次没有通过怎么办,计算机应用基础第三次作业
  7. linux显卡测试radeon,15款热门显卡对比:Radeon RX 6800系列在Linux 1440p环境下表现出色...
  8. el-tooltip位置不灵活_小厨房里的收纳,贵在灵活
  9. atoi函数_linux网络编程之POSIX 消息队列 和 系列函数
  10. java服务端开发 php_Java和 PHP哪种语言更适合直播系统后台开发