感受野是卷积神经网络中比较重要的概念,看到了很好的一篇博文,结合这两篇文章,并加上自己的感悟吧!
https://www.jianshu.com/p/2b968e7a1715
https://zhuanlan.zhihu.com/p/28492837
1. 举例示意
-
e.g.两层 3*3 卷积操作的有效区域(感受野)是5*5 (所有filter的stride=1,pad=0),示意图如下:
- 三层3*3卷积核操作的有效区域是7*7 (所有filter的stride=1,pad=0),示意图如下:
2. 基本定义:
- 定义:感受野用来表示网络内部的不同神经元对原图像的感受范围的大小,或者说,convNets(cnn)每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。
- 神经元之所以无法对原始图像的所有信息进行感知,是因为在这些网络结构中普遍使用卷积层和pooling层,在层与层之间均为局部连接。
- 神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局,语义层次更高的特征;相反,值越小则表示其所包含的特征越趋向局部和细节。因此感受野的值可以用来大致判断每一层的抽象层次。
3. 感受野的计算
可以看到在Conv1中的每一个单元所能看到的原始图像范围是3*3,而由于Conv2的每个单元都是由 2*2范围的Conv1构成,因此回溯到原始图像,其实是能够看到5*5的原始图像范围的。因此我们说Conv1的感受野是3,Conv2的感受野是5. 输入图像的每个单元的感受野被定义为1,这应该很好理解,因为每个像素只能看到自己。
具体计算时,从最深处往回计算,以最后一个单元作为1:
RF = 1
for layer in (high layer To low layer):
RF = ((RF -1)* stride) + fsize
根据公式,我们也可以得到,增大感受野的几种方法:
- 增加pooling层,但是会降低准确性(pooling过程中造成了信息损失)
- 增大卷积核的kernel size,但是会增加参数
- 增加卷积层的个数,但是会面临梯度消失的问题
最后谈一下个人对感受野的理解吧,
首先为什么它很重要?
前面看过感受野的定义,是表示在前几层对应的图像区域的大小,那么为了保证所利用的信息是全局的,而不仅仅是局部信息,我们就应该保证感受野较大。同时,合理计算感受野,可以保证效率,例如,输入图像大小是128*128,如果最后一层的感受野已经可以超过128,我们可以认为在做最后的分类判断时所用到的特征已经涵盖了原始图像所有范围的信息了。如果能够尽可能的降低网络的参数总量,也十分重要。
其次有哪些方法呢?
网络层数增加,必然可以使感受野增大。所以在保证梯度的前提下,利用ResNet,DenseNet等结构加大网络深度。
使用膨胀卷积 Multi-Scale Context Aggregation by Dilated Convolutions: https://arxiv.org/abs/1511.07122;
使用可变形卷积等 Deformable Convolutional Network: https://arxiv.org/pdf/1703.06211.pdf。
最后,多多推公式和复习基础吧!