卷积网络之感受野

本文介绍了卷积神经网络中感受野的概念及其计算方法。详细解释了不同层的感受野大小如何受到滤波器尺寸和步长的影响,并给出了计算公式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载 http://www.cnblogs.com/objectDetect/p/5947169.html

感受野的概念

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

                

感受野大小的计算

 感受野计算时有下面的几个情况需要说明:

a)第一层卷积层的输出特征图像素的感受野的大小等于滤波器的大小;

b)深层卷积层的感受野大小和它之前所有层的滤波器大小和步长有关系;

c)计算感受野大小时,忽略了图像边缘的影响,即不考虑padding的大小。

此外,关于每一层的strides的说明,这个strides是之前所有层stride的乘积

stridesi= stride(1) * stride(2) * ...* stride(i-1)

对于单层卷积网络,其feature map上每个特征点对应原图上的感受野大小等于卷积层滤波器的大小;对于多层卷积网络,可由此逐层往回反馈,通过反复迭代获得原始输入图像中感受野大小,即后面深层的卷积层感受野大小就和之前所有网络层的滤波器大小和步长有关系了,在计算的时候,忽略图像Padding的大小。使用的公式可以表示如下:    

r(i) = (r(i+1) - 1) * stride(i) + c(i)

其中,  r(i)表示第i层感受野大小,stride(i)表示第i层步长,c(i)表示第i层卷积核大小。  

此外,对于卷积网络中的激活函数层(ReLU/Sigmoid/...)等,感受野迭代公式为:

r(i)=r(i+1)

 

其他参考

http://blog.cvmarcher.com/posts/2015/05/17/cnn-trick/

https://zhuanlan.zhihu.com/p/23358015

http://stackoverflow.com/questions/37136829/receptive-fields-on-convnets-receptive-field-size-confusion/37143998#37143998

 


### 卷积神经网络感受野计算方法 在卷积神经网络(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 ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值