感受野(Receptive Field, RF)是卷积神经网络(CNN)中的一个重要概念,它指的是网络中某个特定神经元能够接收到的输入图像上的区域大小。换句话说,感受野定义了输出特征图中的每个单元依赖于输入图像中哪些像素。理解感受野对于设计和调试CNN架构非常重要,因为它直接影响模型捕捉到的上下文信息量。
感受野的计算
感受野的计算涉及多个因素,包括卷积核大小、步长(stride)、填充(padding),以及池化操作等。随着网络深度的增加,感受野会逐渐扩大,因为每一层都在其前一层的感受野基础上进行操作。
感受野的计算公式如下:
RF new = RF old + ( kernel size − 1 ) × jumper old \text{RF}_{\text{new}} = \text{RF}_{\text{old}} + (\text{kernel size} - 1) \times \text{jumper}_{\text{old}} RFnew=RFold+(kernel size−1)×jumperold
其中:
- R F o l d RF_{old} RFold 是前一层的感受野。
- k e r n e l s i z e kernel size kernelsize 是当前层的卷积核或池化核大小。
- j u m p e r o l d jumper_{old} jumperold 是前一层的
jumper
值。 - R F n e w RF_{new} RFnew 是更新后的感受野。
jumper
(有时也被称为“有效步长”或“累积步长”)是用于计算感受野(Receptive Field, RF)时的一个重要概念。它表示当前层相对于输入层的像素间距,即从输入图像到当前层,每个输出单元在原始输入图像上对应的实际距离。随着网络深度的增加,这个距离会根据每一层的步长和卷积/池化操作而累积变化。
jumper 的计算
jumper
的初始值为1,因为它代表了输入层本身,此时每个像素点的感受野只包含自身。对于后续每一层,jumper
的更新规则如下:
jumper new = stride × jumper old \text{jumper}_{\text{new}} = \text{stride} \times \text{jumper}_{\text{old}} jumpernew=stride×jumperold
其中:
stride
是当前层的步长。- j u m p e r o l d jumper_{old} jumperold 是前一层的
jumper
值。 - j u m p e r n e w jumper_{new} jumpernew 是更新后的
jumper
值,用于计算下一层的感受野。
基本公式
假设我们从一个输入层开始,逐层计算感受野,可以使用以下递归公式:
-
初始状态:
- 感受野:1x1
jumper
(或称为累积步长):1
-
卷积层/池化层:
- 感受野更新公式:
RF new = RF old + ( kernel size − 1 ) × jumper old \text{RF}_{\text{new}} = \text{RF}_{\text{old}} + (\text{kernel size} - 1) \times \text{jumper}_{\text{old}} RFnew=RFold+(kernel size−1)×jumperold jumper
更新公式:
jumper new = stride × jumper old \text{jumper}_{\text{new}} = \text{stride} \times \text{jumper}_{\text{old}} jumpernew=stride×jumperold
- 感受野更新公式:
具体例子
在CNN网络中,图A经过核为3x3,步长为2的卷积层,ReLU激活函数层,BN层,以及一个步长为2,核为2x2的池化层后,再经过一个3x3的的卷积层,步长为1,此时的感受野是多少?
我们来具体计算每层的感受野
和jumper
:
-
初始状态:
- 感受野:1x1
jumper
:1
-
第一个3x3卷积层,步长为2:
- 感受野: RF new = 1 + ( 3 − 1 ) × 1 = 3 \text{RF}_{\text{new}} = 1 + (3 - 1) \times 1 = 3 RFnew=1+(3−1)×1=3
jumper
: jumper new = 2 × 1 = 2 \text{jumper}_{\text{new}} = 2 \times 1 = 2 jumpernew=2×1=2
-
ReLU激活函数层 和 BN层:
- 这些层不会改变感受野或
jumper
,因此它们的感受野和jumper
与前一层相同。 - 感受野:3x3
jumper
:2
- 这些层不会改变感受野或
-
2x2池化层,步长为2:
- 感受野: RF new = 3 + ( 2 − 1 ) × 2 = 5 \text{RF}_{\text{new}} = 3 + (2 - 1) \times 2 = 5 RFnew=3+(2−1)×2=5
jumper
: jumper new = 2 × 2 = 4 \text{jumper}_{\text{new}} = 2 \times 2 = 4 jumpernew=2×2=4
-
第二个3x3卷积层,步长为1:
- 感受野: RF new = 5 + ( 3 − 1 ) × 4 = 5 + 8 = 13 \text{RF}_{\text{new}} = 5 + (3 - 1) \times 4 = 5 + 8 = 13 RFnew=5+(3−1)×4=5+8=13
jumper
: jumper new = 1 × 4 = 4 \text{jumper}_{\text{new}} = 1 \times 4 = 4 jumpernew=1×4=4
因此,最终的感受野是13x13。
感受野的意义
- 大感受野:意味着神经元能够“看到”更大的输入区域,这有助于捕捉更广泛的上下文信息,适合处理需要全局信息的任务,如分类任务。
- 小感受野:意味着神经元只能“看到”较小的输入区域,这有助于捕捉局部特征,适合处理需要精细局部信息的任务,如边缘检测。
在设计CNN时,理解并控制感受野的大小可以帮助优化网络性能,确保模型既能捕捉到必要的细节,又能覆盖足够的上下文信息。