深度学习中CNN网络的感受野计算(Calculating Receptive Field of CNN)


主要参考博客1
主要参考博客2

公式来源链接


感受野概念

在卷积神经网络中,感受野(Receptive Field)的定义是卷积神经网络每一层输出的特征图(feature map)上每个像素点在原始图像上映射的区域大小,这里的原始图像是指网络的输入图像,是经过预处理(如resize,warp,crop)后的图像。

为什么要计算感受野?
因为感受野代表了深度学习网络每一层中的像素映射到输入图像的区域,感受野的大小直接影响网络层对于输入图像的特征感受级别,即每一层获得的特征(feature map)是全局的、语义层次比较高的,还是局部的、细节的特征。一般来说感受野小的时候,也就是CNN网络的头部层,其经过卷积和池化的次数较小,输出的feature map大小较大,反映的特征也更为精细和注重细节;而在CNN网络的尾部层,输入图像经过了大量的卷积和池化次数,feature map的尺寸大小降低的很小,感受野也变的很大,一个像素可以看到前部层的很大一个区域,因此这种feature map反映出来的特征更加注重整体和全局。所以这也是感受野概念的来源,精确计算感受野的大小对于设计良好的网络具有重要作用。


感受野计算公式—从第一层开始计算

### Bottleneck Building Block 的感受野计算 在卷积神经网络 (CNN) 中,瓶颈结构(Bottleneck Building Block)是一种常见的设计模式,通常用于减少参数数量并加速推理过程。其核心思想是通过降维操作压缩输入数据的维度,在保持性能的同时降低计算成本。 #### 感受野的概念 感受野是指 CNN 卷积层中的某个节点能够感知到的原始输入图像区域大小。对于 bottleneck 结构而言,由于其内部可能包含多个卷积核尺寸以及跨层连接机制,因此其感受野计算需要综合考虑每一层的影响[^1]。 #### Bottleneck Structure 的典型组成 以 ResNet 或 MobileNet 系列为例,典型的 bottleneck structure 可能由以下几个部分构成: 1. **1x1 Convolution**: 用于降维或升维。 2. **3x3 Convolution**: 提供主要的空间特征提取能力。 3. **1x1 Convolution**: 将特征图恢复至原来的通道数。 假设每一步都采用步幅为 `s` 的卷积运算,则整体感受野可以通过逐层累加的方式进行推导: #### 感受野的递归公式 设第 $ l $ 层的感受野为 $ R_l $ ,则有如下关系: $$ R_{l} = s \cdot R_{l-1} + k - 1 $$ 其中: - $ s $ 是当前层的 stride; - $ k $ 是当前层使用的卷积核大小。 对于 bottleneck block 来说,如果中间的 3x3 卷积使用了 stride=2 进行下采样,则该层会显著扩大整个 block 的感受野范围[^2]。 另外需要注意的是,当引入 depthwise separable convolution (如 MobileNet V2/V3 所做的改进),虽然减少了 FLOPs 数量,但由于 kernel size 不变,所以理论上的最大感受野并不会受到影响[^4]。 #### 实际案例分析 例如在一个标准的 ResNet50 架构中,第一个 bottleneck block 后面紧接着几个连续的标准 blocks 都维持相同的 spatial dimensions 。这意味着除了第一次 downsample 导致较大的初始 RF 外,后续相同配置下的 layers 对总 receptive field 的贡献相对较小一些[^3]。 ```python def calculate_receptive_field(kernel_size, stride, padding, input_rf=1): """ Calculate the effective receptive field of a single layer. Args: kernel_size (int): Size of the convolving kernel. stride (int): Stride of the convolution operation. padding (int): Zero-padding added to both sides of the input. input_rf (int): Receptive field from previous layer. Returns: int: Effective receptive field after this layer. """ return stride * input_rf + kernel_size - 2*padding - 1 # Example usage for calculating RF within a bottleneck block rf_1x1_first = calculate_receptive_field(1, 1, 0) rf_3x3_middle = calculate_receptive_field(3, 2, 1, rf_1x1_first) # Assuming strided middle conv final_rf_bottle_neck = calculate_receptive_field(1, 1, 0, rf_3x3_middle) print(f"Final Receptive Field in BottleNeck Block: {final_rf_bottle_neck}") ``` 以上代码片段展示了如何逐步计算一个简单 bottleneck block 内部各阶段后的最终感受野值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值