感受野
- 一、感受野
- 1.全连接网络与卷积神经网络
- 2.进一步体验“感受野”
- 3.计算感受野通用方式
- 4.综合实例
- 5.总结
一、感受野
感受野:卷积神经网络中每个网络层输出的特征图中的单个元素映射回原始输入特征中的区域大小,网络层越深,其输出特征的元素对应感受野越大。可以这么去描述感受野:网络层输出特征图上的一个元素点,由原始输入中多大区域映射而来,其感受野就是多大。
1.全连接网络与卷积神经网络
对于全连接网络而言,其输出中的每一个元素都受到输入特征中所有元素的影响,而对于卷积神经网络而言,利用卷积核与输入特征之间的互相关操作提取特征,输出特征中的每一个元素由卷积核在输入特征上的一次移动得到,而卷积核的每次移动均是与输入中与之对应的局部区域进行运算,既输出中的每个元素只由输入中的局部区域影响,此处所说的局部区域的大小也就是网络层输出特征中元素的感受野。
此处对全连接网络与卷积神经网络进行实例对比(网络均只有一层):
1)全连接网络:可看到共输出5个元素,每个元素都受到输入中的所有元素影响。
2)卷积神经网络:可看到输出中的每个元素都由(3,3)的卷积核对应输入中(3,3)的局部区域“加权求和”得到,所以该输出的特征元素对应到输入中的区域大小就是3×3,既其感受野大小为3×3。
2.进一步体验“感受野”
下面的示例中所有卷积核大小均为:(3,3),图中的红线表示卷积层,如步长、填充等参数都保持默认:
1)原始输入(3,3),共经历1个卷积层:此时,唯一的卷积层输出结果为(1,1),输出特征仅含有一个元素,而该元素对应输入中的3×3区域,故其感受野为3×3。
2)原始输入(5,5),共经历2个卷积层:此时,第一个卷积层输出结果为(3,3),而第二个卷积层输出为(1,1)。第二层的输出仅有一个元素,该元素是由第一层输出结果中(3,3)特征得到;而对于第一层输出结果而言,其中的每一个元素的感受野是3×3,所有元素是通过原始输入中的(5,5)区域映射而来,所以对于第二层输出结果来说其元素的感受野为(5,5)。
3)原始输入O(7,7),共经历3个卷积层:此时三个卷积层的输出依次为A(5,5),B(3,3)和C(1,1)。对于C而言,仅有一个元素,是由B中3×3区域得到;对于B而言,每个元素由A中(3,3)区域得到,所有元素由A中(5,5)区域得到;对于A而言,每个元素由原始输入O中(3,3)区域得到,所有元素由O中(7,7)区域得到,A中一个(3,3)区域的特征由O中(5,5)特征映射而来,所以对于三个卷积层的输出结果A、B、C来说,感受野依次为(3,3)、(5,5)、(7,7)。
由上面的例子也可以看到通常情况下,网络越深,输出的结果所拥有的感受野越大。
所以对于当前层的输出结果,要看其感受野多大可通过以下方式:从当前层的输出结果反向映射,直到映射回原始输入特征,此时即可得到对应的感受野大小。比如上图中的第三层结果C,C由中的元素由B中的3×3区域得到,B中的3×3区域需要A中的5×5区域得到,而A中的5×5区域由原始输入中的7×7区域得到,所以对于C中元素而言,其感受野大小为7×7。
看到这里大家对感受野的计算如果还没透彻,请不要着急,看一下下一节的感受野计算方式,再回过头来看我画的图,是不是一目了然。
3.计算感受野通用方式
我们知道在实际搭建卷积神经网络时可能用到大量的卷积层、池化层进行堆叠构成完整的网络结构,而这两种网络层均会改变特征图的大小,实现特征之间的映射,在这两种网络层中均涉及到卷积核(或池化核)kernel_size、步长stride等参数,这些参数共同决定了输出结果对应的感受野大小。
在计算感受野的过程中需要注意以下几点:
(1)计算感受野时不考虑padding和dilation的影响;
(2)当前网络层对于当前层输入来说,感受野大小等于当前卷积核大小。如上图中最后一层的输出C相对于B来说,感受野为(3,3);
(3)采用“从后往前”的计算方式计算感受野:从当前层开始反向映射直到原始输入,先计算当前层输出在前一网络层输出中的感受野大小,再依次传递到原始输入即可得到当前层所拥有的感受野大小;
(4)感受野计算通用公式:此处RF、S、K分别表示感受野、步长、卷积核大小,计算第i层输出结果的感受野时,利用上面公式从RF(i)一直计算到RF(1)时,RF(1)即为第i层对应的感受野大小。
有没有看到计算感受野的这个公式特别熟悉,没错这和卷积层(其他参数保持默认)计算输出结果大小的公式一毛一样:
很好理解,卷积层输出和输入结果的指定大小区域之间遵循上面公式。以此可得到相邻网络层之间感受野大小的计算关系。
这里我再将上一节中最后的一个示例推导一波,以此验证感受野计算公式:
输入(7,7);输出(1,1)
网络层 | 输入 | 卷积核 | 步长 | 输出 | 感受野 |
---|---|---|---|---|---|
Conv1 | (7,7) | (3,3) | 1 | (5,5) | (3,3) |
Conv2 | (5,5) | (3,3) | 1 | (3,3) | (5,5) |
Conv3 | (3,3) | (3,3) | 1 | (1,1) | (7,7) |
网络共包含三个卷积层,从前往后以此标记为1,2,3层,下面从后往前计算每层感受野,当前层感受野大小受到当前层卷积核大小、步长以及下一层的感受野共同影响:
计算Conv3的感受野大小:
- Conv3在Conv2的(3,3)输出中感受野大小等于Conv3卷积核,既RF3=3×3;
- 要想Conv2得到RF3=3×3大小的输出,输入需提供RF2=S2(RF3-1)+K2=1×(3-1)+3=5,既RF2=5×5;
- 同理,要想Conv1得到RF2=5×5大小的输出,输入需提供RF1=S1(RF2-1)+K1=1×(5-1)+3=7,既RF1=7×7;
因此对于Conv3的输出来说,感受野大小为(7,7).
按照此方式,大家可以自行计算Conv2输出结果的感受野为(5,5)。
4.综合实例
举一个综合实例,依据“从后往前”原则计算最后一个网络层在原始输入上的感受野大小:
索引 | 网络层类型 | 卷积核尺寸 | 步长 |
---|---|---|---|
1 | Conv1 | 3×3 | 1 |
2 | Conv2 | 2×2 | 2 |
3 | Pool1 | 3×3 | 1 |
4 | Conv3 | 3×3 | 1 |
5 | Pool2 | 2×2 | 2 |
6 | Conv4 | 2×2 | 2 |
计算Conv4层输出结果的感受野:
- RF6=2 ;
- RF5=S5(RF6-1)+k5=2(2-1)+2=4 ;
- RF4=S4(RF5-1)+k4=1(4-1)+3=6;
- RF3=S3(RF4-1)+k3=1(6-1)+3=8 ;
- RF2=S2(RF3-1)+k2=2(8-1)+2=16;
- RF1=S1(RF2-1)+k1=1(16-1)+3=18;
因此对于Conv4层输出结果中的元素,其在原始输入上的感受野大小为18×18。
5.总结
1)输入结果感受野一致的前提下,使用连续的小卷积核替换单个大卷积核,第一可以有效降低网络训练的参数量,第二可以增加网络深度,第三可以引入更丰富的非线性变换,使得网络可以拟合更多的可能性,更好地缓解过拟合;
输入(C,7,7),对于最终的输出其感受野为(7,7),假设每个卷积层的输出通道数均为C,我们看一下各自的参数量:
(1)使用连续的3个(3,3)卷积,其参数量为:(3×3×C)×C×3=27×C×C
(2)使用一个(7,7)卷积,其参数量为:(7×7×C)×C=49×C×C
由此看到感受野一致的前提下,使用连续的小卷积核替换单个大卷积核,可以有效降低网络训练的参数量。
2)网络浅层提取的特征针对输入特征的局部区域进行,感受野较小;而网络深层对应的感受野更大,可以体现原始输入更多的全局信息;
3)在分类任务中,合理设计网络深度,可得更合理的感受野,保证网络性能。如此操作使最后的输出结果中,元素对应的感受野可以大于等于原始输入特征的大小,这样可确保分类所用特征可以包含原始输入所有的信息。比如在一个分类网络中,原始输入大小为(64,64),而输出结果中元素对应的感受野大小超过了64×64,那么可保证最后分类判断所用特征可以体现原始输入中所有的信息。