感受野
1. 基本概念
感受野(Receptive Field)指的是在输入图像上,能够影响到 CNN 中某一个特定特征值的那片区域。它的基本属性为中心位置和尺寸。
例如下面这个例子:
这里的绿色特征图的每一个绿色点都是由一个 3x3 卷积层在蓝色的输出图上平移得到的,因此它的感受野为3。
然后我们再使用一个卷积层得到一个黄色特征图:
黄色特征图中的每个黄色点都是由一个3x3的卷积核在绿色图上计算得来的。水平方向上,它依赖于3个水平排列的绿色点。由于步长为 2(由图可知,绿色点隔一个取一个),第二个感受野中心在 1+2=3,最右边的感受野中心为 3+2=5,也就是这三个点的跨度为5
然后除了中心的跨度之外,绿色的点还有自己的感受野,它的 3x3 感受野以它的中心为基准、向左右均匀延伸 (3-1)/2=1。因此蓝色点的最终感受野范围,就是在3个绿色点的跨度外、左右各均匀延伸,也就是 5+1x2=7。
可以看到,随着卷积层的堆叠,感受野在逐渐增大,这正是卷积神经网络的精妙之处。
感受野内的所有像素并非同等重要,一个像素越靠近感受野的中心,它对最终输出特征值的贡献就越大。
2. 感受野计算
属性定义
由前面的推导,我们定义如下属性:
- 感受野大小 :前面说的单个特征能够“看到”的原始输入图像区域的边长。
- 跳跃距离 :原始输入图像的坐标系上,两个相邻特征的中心点之间的距离。
- 起始坐标 :这一层左上角第一个特征的感受野中心,在原始输入图像坐标系中的坐标。这为整个特征网格在输入图像上进行了“定位”。
这些属性都是相对原始输入图像度量的,这也是这种计算方法避免信息丢失的原因。
具体公式
下面我们分别解释一下这几个公式:
- 第一个公式是标准的卷积输出尺寸计算公式,它不涉及感受野,只是计算特征的数量。
- 第二个公式是计算输出层特征之间的新跳跃距离。这个公式非常直观:输入层的特征在原图上是以 的间隔排布的。卷积操作的步幅 意味着它每移动一步就会跳过 个输入层的特征。
- 第三个公式是计算新感受野大小的重要公式。它描述的过程是和前面具体例子计算类似的算法:
- 首先它计算感受野间纯粹的距离 。在前面的例子中,这个值是 2x(3-1)=4(前面算的是5,这里减去1刚好表示纯粹距离)。
- 然后它将两边延伸的部分加起来,这个值正好等于一个完整的输入特征(在这里是绿色点)的感受野大小。这和我们前面的计算方法类似,只是由于前面计算的是纯粹距离,这里延伸部分的值刚好是 。
- 第四个公式用于计算第一个特征的中心坐标:
- 用于计算从输入层第一个中心移动到它的 卷积核中心的距离,这个是显然的。
- 然后我们需要考虑 padding 的影响。padding 能够让我们的卷积核扫描到原始图像更左边的地方,每加上一个 padding,卷积核就可以向左移动一个输入特征单位,也即 。
由于这些公式是递归定义的,我们需要确认一个初始值。我们定义:
3. 感受野的实际意义
不同任务需求的感受野
-
对于需要理解全局信息的任务:比如图像分类,网络最终需要看到整个图像才能判断这是“猫”还是“狗”。如果网络设计得不合适,导致最后一层特征的感受野还很小,只覆盖了图像的一小部分(比如只看到了猫的耳朵),那它就不可能做出准确的分类。通过计算感受野,我们可以在训练前就检验网络在最后一层是否具有足够大的感受野来覆盖整个输入图像。
-
对于需要精细定位的任务:比如目标检测或语义分割,我们既需要大的感受野来理解上下文(比如知道这是一个“人”在“骑自行车”),也需要小的感受野来精确定位物体的边界(比如自行车的轮廓)。计算感受野可以 确保不同尺寸的目标都能被检测到。
小目标的检测需要较小的感受野,大目标的检测需要较大的感受野。如果网络所有层的感受野都很大,可能就会“忽略”掉小物体。这就是为什么很多现代检测网络(如SSD, YOLO)会从不同层引出特征图来进行预测,因为不同层的感受野大小不同,可以适配不同尺寸的目标。
同时,计算出某个激活值最高的特征对应的感受野,并将其在原图上高亮出来,我们就能直观地看到“模型在做决策时,到底在看哪里”。这对于理解模型的内部工作机制、增加模型的可解释性非常有帮助。