卷积神经网络的感受野计算

本文主要介绍了感受野(RF),通俗解释其为输入图像对输出神经元的影响程度。通过具体卷积例子可视化感受野,给出从top往下层层迭代计算RF的公式,并提供matlab代码示例。最后推荐了可检验RF计算结果的网站FOMORO AI。

转自:https://zhuanlan.zhihu.com/p/31004121

一、直观的了解 Receptive field (RF)

Receptive field 是啥?看看网上的大佬们怎么说。

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). —— Dang Ha The Hien

 

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

 

在机器视觉领域的深度神经网络中有一个概念叫做感受野,用来表示网络内部的不同位置的神经元对 原图像的感受范围的大小。 —— 蓝荣祎

之所以列这么多感受野的定义,是想表明感受野的定义虽多,但大都是一个意思。通俗的说,感受野就是输入图像对这一层输出的神经元的影响有多大。形象的说,就是你的曾曾曾曾曾爷爷对他的后代们有多少影响这么一个概念。所以影响大不一定好,也许会带来用不着的糟粕。影响小也会阻碍后代学习传统知识。好了,扯回来,今天不讨论利弊,就讨论如何正确的计算感受野(RF)。

在学习计算感受野之前,先可视化一下感受野吧。举一个例子,原始图像为 [公式] ,卷积核(Kernel Size)为 [公式] ,padding 为 [公式] ,stride为 [公式] ,依照此卷积规则,连续做两次卷积。熟悉卷积过程的朋友都知道第一次卷积结果是 [公式] 大小的feature map,第二次卷积结果是 [公式] 大小的feature map。整个过程如图所示:

第一次卷积得到3*3的 feature map,RF为3*3

 

 

黄色feature map对应的感受野是7*7大小

二、如何计算RF

公式一:这个算法从top往下层层迭代直到追溯回input image,从而计算出RF。

 

(N-1)_RF = f(N_RF, stride, kernel) = (N_RF - 1) * stride + kernel

 

其中,RF是感受野。N_RF和RF有点像,N代表 neighbour,指的是第n层的 a feature在n-1层的RF,记住N_RF只是一个中间变量,不要和RF混淆。 stride是步长,ksize是卷积核大小。

我来解释一下这个公式。(图片有点丑,不过不影响理解。)首先,我们的问题是右一的红叉叉映射到左一中,应该是什么size?自然思路就是右一的红叉叉映射到中间是什么size?因为卷积核是3*3,所以右一的红叉叉映射到中间是3*3. 那么接下来我们如果算出来中间3*3的红框框映射到左一是什么size,不就解决了我们的问题嘛。聪明的我们就发现了从中间映射到左边的size是kernel_size+stride*(3-1). 抽象一下就是kernel_size +stride*(N_RF-1)嘛。接下来就很简单了,一层又一层的迭代下去直到迭代到第一层,就求出了RF。Note: kernel_size和stride是左一的,而N_RF是中间的。

举一个小小的例子:

一个输入随意,第一层卷积核参数为ksize = 3, stride = 2,第二层ksize =3,stride=2,第三层ksize=3,stride=1.写一段代码计算RF,matlab代码如下:

ksize = 3;
strides = [1 2 2];
N_RF = 1;
for i = 1:3
    
    N_RF = (N_RF -1)*strides(i) + ksize;
    
end
fprintf('The RF is: %d \n',N_RF)

结果:15

公式二有时间再写。

三、检验你的RF

看到这里的,奖励你认真好学,送福利了。不知道自己RF算得对不对?看下面这个网站。

FOMORO AI

三个高级工程师搞的网站,可以简单的输入网络参数,就直接把你的感受野计算出来。界面如下。PS: 话说老外把科研成果转化成产品的能力简直不要太强,产品不要太大方,太漂亮。学习学习。

 

为什么第二层到第一层,padding变成了3? 这样的话不是越往前追溯padding越多??这样计算感受野是正确的吗

 

 

 

 

 

 

### 卷积神经网络感受野计算方法 在卷积神经网络(CNN)中,感受野(receptive field, RF)定义了当前层的一个节点能够感知到的输入数据区域大小。对于第 k 层的感受野大小 \( L_k \),可以使用正向公式的迭代方式来计算。 给定初始条件,在第一层即输入图片的情况下,参数设定为:\( n=\text{image\_size} \), \( r=1 \), \( j=1 \), 和起始位置 \( start=0.5 \)[^1]。这里: - \( n \): 输入图像尺寸; - \( r \): 当前层的感受野半径,默认初始化为 1 表示单个像素的影响范围; - \( j \): 跨距(jump),表示相邻两个特征点之间的距离关系; - \( start \): 特征图上第一个单元格中心相对于原图的位置偏移量; 随着层数增加,每经过一层卷积操作或池化操作后,这些变量会按照特定规则更新。具体来说,当处理至第 k 层时,假设该层之前有若干次卷积/池化变换,则新的感受野大小可以通过下面简化后的公式得到: \[ L_k = (k-1)\times s + f \] 其中, - \( s \) 是步长(stride), - \( f \) 则代表滤波器(filter/kernel)尺寸, - \( k \) 表明这是第几层的操作[^2]. 此表达式表明,每一新增加的卷积层都会使得下一层结点所覆盖的实际物理空间扩大一定倍数,并且这种增长取决于前面提到的几个因素共同作用的结果。 为了更加直观地展示这一过程,考虑一个简单的例子。如果有一个两层的 CNN 结构,其中第一层采用的是 \( 3\times3 \) 大小的内核以及单位步幅(stride=1),那么第二层的感受野将会是: \[ L_2=(2-1)*1+3=4\] 这意味着位于第二层任一激活值实际上对应着原始输入图像上的 \( 4\times4 \) 区域内的信息综合效果。 ```python def calculate_receptive_field(layer_index, stride, kernel_size): """ 计算指定层的感受野大小 参数: layer_index : int 类型, 表示要查询哪一层的感受野; stride : int 或者 list/tuple 类型, 如果各层相同则传入整数, 否则提供列表形式的具体数值; kernel_size : int 或者 list/tuple 类型, 描述过滤器尺寸. 返回: float 类型, 对应于请求层的感受野大小. """ if isinstance(stride, (list,tuple)): strides=stride[:layer_index] else: strides=[stride]*layer_index if isinstance(kernel_size,(list,tuple)): kernels=kernel_size[:layer_index] else: kernels=[kernel_size]*layer_index receptive_field=sum([(i*strides[j]+kernels[j])for i,j in enumerate(range(layer_index))])+1 return receptive_field ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值