卷积神经网络感受野详解与计算实战
在卷积神经网络(CNN)中,**感受野(Receptive Field)**是一个核心概念。简单来说,它指的是输出特征图(Feature Map)上某一个像素点,对应到原始输入图像上的区域大小。通俗理解就是,特征图上的一个点'看'到了输入图的哪一块区域。
直观示例
我们可以通过简单的卷积操作来观察感受野的变化规律。假设使用步长(stride)为 1、填充(padding)为 0 的 3x3 卷积核:
- 两层 3x3 卷积:经过两次 3x3 卷积后,最终输出的特征图上一点,对应的输入区域变为 5x5。
- 三层 3x3 卷积:再增加一层同样的卷积,感受野会扩大到 7x7。
这种叠加效应意味着,随着网络层数加深,每个神经元能'看到'的输入范围越来越大,这对捕捉全局信息至关重要。
感受野的计算逻辑
计算感受野时,我们通常采用从最后一层向前推导的方法。这里有几个关键点需要注意:
- 最后一层(无论是卷积还是池化)的输出特征图,其感受野大小等于该层的卷积核大小。
- 第 i 层的感受野不仅取决于本层的卷积核大小和步长,还依赖于第 i+1 层的感受野。
- 计算过程中通常忽略边缘 padding 的影响,专注于核心区域的映射。
具体的递推公式如下:
$$ RF_i = (RF_{i+1} - 1) \times stride_i + Ksize_i $$
其中:
- $RF_i$:第 i 层的感受野大小
- $RF_{i+1}$:第 i+1 层的感受野大小
- $stride_i$:第 i 层的步长
- $Ksize_i$:第 i 层的卷积核大小
这个公式体现了'回溯'的思想:要算出当前层能看到多大,得先知道下一层能看到多大,再结合当前层的步长和核大小进行扩展。
实战:VGG16 网络感受野计算
理论懂了,我们来看个实际案例。VGG16 结构相对复杂,为了演示清楚,我们先拆解它的层级结构,从后往前推算。
假设我们关注的是 VGG16 中 pool3 之前的感受野变化:
- pool3 层:作为最后一层池化,其输出特征图的感受野直接等于卷积核大小,即 2。
- conv4 层:基于上一层的 RF=2,步长为 1,核大小为 3。计算:$(2-1) \times 1 + 3 = 4$。
- conv3 层:上一层 RF=4,步长 1,核大小 3。计算:$(4-1) \times 1 + 3 = 6$。
- pool2 层:上一层 RF=6,步长 2,核大小 2。计算:$(6-1) \times 2 + 2 = 12$。
- conv2 层:上一层 RF=12,步长 1,核大小 3。计算:$(12-1) \times 1 + 3 = 14$。
- pool1 层:上一层 RF=14,步长 2,核大小 2。计算:$(14-1) \times 2 + 2 = 28$。
- conv1 层:上一层 RF=28,步长 1,核大小 3。计算:$(28-1) \times 1 + 3 = 30$。
因此,pool3 输出的特征图在原始输入图片上的感受野为 30x30。这意味着网络在这一层已经能够感知到输入图像 30x30 像素范围内的上下文信息。
补充:关于 Feature Map 的理解
在深入 CNN 时,理解 Feature Map 也很重要。每一层卷积处理的数据都是三维的,可以想象成许多张二维图片叠在一起形成的'豆腐块'。
- 生成方式:输入如果是灰度图,只有一个 Feature Map;如果是 RGB 彩色图,通常有 3 个(对应红绿蓝通道)。
- 作用:每一个 Feature Map 代表提取出的某种特定特征,随着网络加深,这些特征会从边缘、纹理逐渐抽象为语义信息。
掌握感受野的计算方法,有助于我们在设计网络架构时更好地控制模型的视野范围,平衡局部细节与全局信息的获取。


