如何理解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大小的区域。
![](https://pic3.zhimg.com/v2-2572f71ee6ce0ed5fc2cf6d89112e53e_b.jpg)
![](https://pic3.zhimg.com/80/v2-2572f71ee6ce0ed5fc2cf6d89112e53e_720w.jpg)
所以,感受野是个相对概念,某层feature map上的元素看到前面不同层上的区域范围是不同的,通常在不特殊指定的情况下,感受野指的是看到输入图像上的区域。
为了具体计算感受野,这里借鉴视觉系统中的概念,
准确计算感受野,需要回答两个子问,即视野中心在哪和视野范围多大。
- 只有看到”合适范围的信息”才可能做出正确的判断,否则就可能“盲人摸象”或者“一览众山小”;
- 目标识别问题中,我们需要知道神经元看到是哪个区域,才能合理推断物体在哪以及判断是什么物体。
但是,网络架构多种多样,每层的参数配置也不尽相同,感受野具体该怎么计算?
2. 计算感受野的大小
在正式计算之前,先对数学符号做如下约定,
![](https://pic1.zhimg.com/v2-420a19b66a80cbe2365381210cba7dbc_b.jpg)
: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;
![](https://pic3.zhimg.com/v2-d552433faa8363df84c53b905443a556_b.gif)
![](https://pic3.zhimg.com/v2-d552433faa8363df84c53b905443a556_b.jpg)
:feature map左上角元素在输入图像上的感受野中心坐标(start,start),即视野中心的坐标,在上图中,左上角绿色块感受野中心坐标为(0.5,0.5),即左上角蓝色块中心的坐标,左上角白色虚线块中心的坐标为(−0.5,−0.5);
:
表示层,卷积层为
,其输入feature map为
,输出为
。
下面假定所有层均为卷积层,其他操作如池化,空洞卷积等可以等价于普通卷积层:
- 对于空洞卷积dilated convolution,相当于改变了卷积核的尺寸,若含有dilationrate参数,只需将
替换为
,dilationrate=1时为正常卷积;
- 对于pooling层,可将其当成特殊的卷积层,同样存在kernel size、padding、stride参数。
- 非线性激活层为逐元素操作,不改变感受野。
2.1 感受野大小的计算
感受野大小的计算是个递推公式:
再看上面的动图,如果feature map 上的一个元素A看到feature map
上的范围为3×3(图中绿色块),其大小等于kernel size
,所以,A看到的感受野范围
等价于
上3×3窗口看到的
范围,据此可以建立起相邻Layer感受野的关系,如下所示,其中
为
的感受野,
为
的感受野:
![](https://pic3.zhimg.com/v2-11da23ab861b339b9c9bcad8b6707472_b.jpg)
一个元素的感受野
等价于
上k×k 个感受野的叠加;
上一个元素的感受野为
;
上连续k 个元素的感受野可以看成是,第1个元素看到的感受野加上剩余k−1步扫过的范围,
上每前进1个元素相当于在输入图像上前进
个像素,结果等于
+(k−1)×
可视化如下图所示:
![](https://pic2.zhimg.com/v2-74c87de0713a1512961e08a497ae44d9_b.jpg)
下面的问题是, 怎么求?
上前进1个元素相当于
上前进
个元素,转换成像素单位为:
![](https://pic2.zhimg.com/v2-f9d44a54e24c9cc01c5102b02bafc3e5_b.jpg)
其中,为
的kernel在
上滑动的步长,输入图像的
。
根据递推公式可知,
![](https://pic1.zhimg.com/v2-c1fdbe60fd19aee3b77ecc955a07e1dc_b.jpg)
上前进1个元素,相当于在输入图像前进了
个像素,即前面所有层stride的连乘。进一步可得,
的感受野大小为:
![](https://pic1.zhimg.com/v2-b4f26bc63e37b2993f0ab8ebea168b34_b.jpg)
2.2 计算感受野中心大小
感受野中心的计算也是个递推公式:
在上一节中计算得,表示feature map
上前进1个元素相当于在输入图像上前进的像素数目,如果将feature map上元素与感受野中心对齐,则
为感受野中心之间的像素距离。如下图所示,
![](https://pic2.zhimg.com/v2-93a99cd695aeb1b8edf0c4b4eac8b7a9_b.jpg)
其中,各层的kernel size、padding、stride超参数已在图中标出,右侧图为feature map和感受野中心对齐后的结果。
相邻Layer间,感受野中心的关系为:
![](https://pic2.zhimg.com/v2-1261160f4a3054dc6459894ad77a6d2d_b.jpg)
所有的start坐标均相对于输入图像坐标系。其中, ,为输入图像左上角像素的中心坐标,
表示
左上角元素的感受野中心坐标,
为
与
感受野中心相对于
坐标系的偏差,该偏差需折算到输入图像坐标系,其值需要乘上
,即
相邻元素间的像素距离,相乘的结果为
,即感受野中心间的像素距离——相对输入图像坐标系。至此,相邻Layer间感受野中心坐标间的关系就不难得出了,这个过程可视化如下。
![](https://pic2.zhimg.com/v2-b0e47afb4880d029101a5699d21f2005_b.jpg)
3. 总结
感受野的计算公式:
![](https://pic2.zhimg.com/v2-54f548165f5edc34cd373912097a44a5_b.jpg)
由上面的递推公式,就可以从前向后逐层计算感受野了,代码可参见computeReceptiveField.py,在线可视化计算可参见Receptive Field Calculator。
最后,还有几点需要注意:
的感受野大小与
、
无关,即当前feature map元素的感受野大小与该层相邻元素间的像素距离无关;
- 为了简化,通常将padding size设置为kernel的半径,即
,可得
,使得feature map
上
位置的元素,其感受野中心坐标为
;
- 对于空洞卷积dilated convolution,相当于改变了卷积核的尺寸,若含有dilationrate参数,只需将
替换为
,dilationrate=1时为正常卷积;
- 对于pooling层,可将其当成特殊的卷积层,同样存在kernel size、padding、stride参数。
- 非线性激活层为逐元素操作,不改变感受野。
[1][2]
参考
- ^彻底搞懂感受野的含义与计算 https://www.cnblogs.com/shine-lee/p/12069176.html
- ^SIGAI-关于感受野的总结 https://zhuanlan.zhihu.com/p/40424530
如何理解CNN中的感受野(receptive-field)以及如何计算感受野?相关推荐
- 感受野-Receptive Field的理解
之前在阅读yolov1的论文时,发现yolov1用到了Resnet,于是找到了Resnet论文,在研究Resnet的时候,发现自己对卷积的相关操作理解还不够深刻,于是研究卷积,发现其中一个比较重要的概 ...
- 深度CNN感受野(Receptive Field)的计算
参考 如何计算感受野(Receptive Field)--原理 FOMORO AI -> 可视化计算感受野的网站,可以用来验证自己计算的结果 Python代码 这里使用的是从后向前的计算方法,简 ...
- 深度学习笔记~感受野(receptive field)的计算
以前对CNN中的感受野(receptive field)已经有了一些认识,基本上是从概念理解上得到的. 本篇文章给出了receptive field的计算过程和相应的python代码,对recepti ...
- 深度学习之学习(1-2)感受野(receptive field)
参见:原始图片中的ROI如何映射到到feature map? - 知乎 1 感受野的概念 在卷积神经网络中,感受野的定义是 卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像 ...
- 感受野(receptive field)
学习RCNN系列论文时, 出现了感受野(receptive field)的名词, 感受野的尺寸大小是如何计算的,在网上没有搜到特别详细的介绍, 为了加深印象,记录下自己对这一感念的理解,希望对理解基于 ...
- 什么是感受野 Receptive Field 感受野是什么意思
有一个人写的很好,放上他写的文章 彻底搞懂感受野的含义与计算 - 知乎 然后嘞,如果你点进去不想看,那你就适合看我写的哈哈 比较浮躁,那就我来吧 首先我们得知道感受野的英文名字哈 洋气 感受野 Rec ...
- 如何计算感受野(Receptive Field)
一.感受野的概念 感受野指的是一个特定的 CNN 特征(特征图上的某个点)在输入空间所受影响的区域. 感受野计算时有下面的几个情况需要说明: a)第一层卷积层的输出特征图像素的感受野的大小等于滤波器的 ...
- 如何计算感受野(Receptive Field)——原理
本文转载自知乎专栏:https://zhuanlan.zhihu.com/p/31004121 写这篇文章的初衷是自己需要计算感受野,但是在今天之前只对感受野有感性认识,并不知道如何定量计算.所以在网 ...
- 池化层(pooling layer) 感受野(Receptive Field) 神经网络的基本组成
目录 (1)本文涉及的函数 (2)池化层 (3)感受野 (4)代码示例(含注释) 承接上两篇博客:卷积层(空洞卷积对比普通卷积).激活函数层 (1)本文涉及的函数 import torch impor ...
最新文章
- 1.1 Friday the Thirteenth
- 2019年北航OO第四单元(UML任务)及学期总结
- python和c哪个适合入门-Python和C先学哪个好?
- Hibernate 二级缓存使用
- java程序课程总结_java课程总结
- 华为AR engine 应用开发学习教程
- md /mdd /ml /mt/mtd
- css sprite原理优缺点及使用
- RabbitMQ中queueBind和exchangeBind方法
- 【看这一篇就够了】如何删除gitHub仓库中的文件
- java定义一个空数组_一个 Java 方法,最多能定义多少参数?
- Jetson Nano配置MCP2515 CANBUS模块
- 历年考研计算机专业英语平均分,历年考研英语平均分及难度分析(截止至2020年)...
- 加域时提示指定的网络名不再可用
- word文档输入带勾的复选框
- 打卡签到python代码_[python] 初学python,打卡签到
- pyqt5 listView 列表显示
- pvp服务器有什么项目,N服PVP服率先回归!压测后未来3-4周正式开服
- Win10软件环境变量配置(配置原因、配置步骤)
- signal函数详解