赞
踩
本文转载自博客园用户 @shine-lee的彻底搞懂感受野的含义与计算。
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上的元素看到前面不同层上的区域范围是不同的,通常在不特殊指定的情况下,感受野指的是看到输入图像上的区域。
为了具体计算感受野,这里借鉴视觉系统中的概念,
准确计算感受野,需要回答两个子问,即视野中心在哪和视野范围多大。
但是,网络架构多种多样,每层的参数配置也不尽相同,感受野具体该怎么计算?
在正式计算之前,先对数学符号做如下约定,
下面假定所有层均为卷积层,其他操作如池化,空洞卷积等可以等价于普通卷积层:
感受野大小的计算是个递推公式:
再看上面的动图,如果feature map 上的一个元素A看到feature map 上的范围为3×3(图中绿色块),其大小等于kernel size ,所以,A看到的感受野范围等价于上3×3窗口看到的范围,据此可以建立起相邻Layer感受野的关系,如下所示,其中为的感受野,为的感受野:
可视化如下图所示:
下面的问题是, 怎么求?
上前进1个元素相当于上前进个元素,转换成像素单位为:
其中,为的kernel在 上滑动的步长,输入图像的 。
根据递推公式可知,
上前进1个元素,相当于在输入图像前进了 个像素,即前面所有层stride的连乘。进一步可得, 的感受野大小为:
感受野中心的计算也是个递推公式:
在上一节中计算得,表示feature map 上前进1个元素相当于在输入图像上前进的像素数目,如果将feature map上元素与感受野中心对齐,则 为感受野中心之间的像素距离。如下图所示,
其中,各层的kernel size、padding、stride超参数已在图中标出,右侧图为feature map和感受野中心对齐后的结果。
相邻Layer间,感受野中心的关系为:
所有的start坐标均相对于输入图像坐标系。其中, ,为输入图像左上角像素的中心坐标, 表示 左上角元素的感受野中心坐标, 为 与 感受野中心相对于 坐标系的偏差,该偏差需折算到输入图像坐标系,其值需要乘上 ,即 相邻元素间的像素距离,相乘的结果为 ,即感受野中心间的像素距离——相对输入图像坐标系。至此,相邻Layer间感受野中心坐标间的关系就不难得出了,这个过程可视化如下。
感受野的计算公式:
由上面的递推公式,就可以从前向后逐层计算感受野了,代码可参见computeReceptiveField.py,在线可视化计算可参见Receptive Field Calculator。
最后,还有几点需要注意:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。