感受野详解

本文详细介绍了卷积神经网络中感受野的概念,通过举例和公式推导说明了感受野的计算方法,包括从前往后和从后往前的计算方式,并以VGG16网络为例进行了具体分析。同时,解释了为何需要增大感受野以获取全局信息,以及感受野大于图片情况的出现原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念

  • 在卷积神经网络中,感受野(Receptive Field)的定义是卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小。再通俗点的解释是,特征图上的一个点对应输入图上的区域,如图1所示。
    在这里插入图片描述
  • 在典型CNN结构中,FC层每个输出节点的值都依赖FC层所有输入,而CONV层每个输出节点的值仅依赖CONV层输入的一个区域, 这个区域之外的其他输入值都不会影响输出值,该区域就是感受野。

举例

  • 两层3*3的卷积核卷积操作之后的感受野是5*5,其中卷积核(filter)的步长(stride)为1、padding为0,如图所示:
    在这里插入图片描述
  • 三层3*3卷积核操作之后的感受野是7*7,其中卷积核的步长为1,padding为0,如图所示:
    在这里插入图片描述

感受野的计算规律

  • 设感受野为r(即r为一个元素映射到输入图像的正方形矩阵的边长,这里假设卷积核为正方形,所以映射也是正方形),s为步长,s1表示步长=1,s2表示步长=2,k为卷积核尺寸。
  • 初始feature map的感受野是1,即 r 0 = 1 r_{0}=1 r0=1,很明显嘛,输入图像还没有经过任何操作,每个元素的感受野当然是1。
  • 规定初始s是1,即 s 0 = 1 s_{0}=1 s0=1
  • 每经过一个conv k*k s,感受野按照如下公式变化: r i + 1 = r i + ( k i + 1 − 1 ) ∗ ∏ n = 0 i s n r_{i+1}=r_{i}+(k_{i+1}-1)*\displaystyle\prod_{n=0}^{i} s_{n} ri+1=ri+(ki+11)n=0isn
    一定要注意这个公式最后的连乘,我自己推公式的时候以为不是连乘而是 s i s_{i} si,其实是是不对的。因为很多博客的推导感受野公式的思路和我不一样,直到看到这篇博客是用的连乘我才意识到自己推导的公式的错误所在。博客链接:https://www.cnblogs.com/ocean1100/p/9864193.html
  • 由上述公式可知, r 1 = k 1 r_{1}=k_{1} r1=k1必然成立,也就是说,第一层的感受野必然等于卷积核的尺寸,这与已知符合。
  • 池化操作和卷积操作都对应上面的公式,其实仔细想想,池化和卷积其实是很相似的。
  • 上述公式是从前往后计算感受野的公式,而从后往前计算感受野可以用下面这个公式:
    r i − 1 = ( r i − 1 ) ∗ s i − 1 + k i − 1 r_{i-1}=(r_{i}-1)*s_{i-1}+k_{i-1} ri1=(ri1)si1+ki1
    此时最后一层感受野的大小=卷积核的大小,其实这种方法的原理就是倒过来看问题,你想最后一层感受野就像是细胞,模拟细胞分裂的过程, + k i − 1 +k_{i-1} +ki1其实是从 r i r_{i} ri中取出1来,这个细胞其实是由前一层卷过来的,卷积核尺寸是 k i − 1 k_{i-1} ki1,所以要加 k i − 1 k_{i-1} ki1,而 剩下的 r i 剩下的r_{i} 剩下的ri,即 r i − 1 r_{i}-1 ri1个感受野则是对应步长的。其实文字不太好叙述,大家需要好好理解一下,从后往前的好处就是不用计算s的叠乘了,不过这对于计算机来说并不是什么难事,从后往前是一种反向思维,我个人感觉从前往后更好理解一些。
  • 特殊情况,经过conv1x1 s1不会改变感受野,经过FC层和GAP层,感受野就是整个输入图像
  • 经过多分枝的路径,按照感受野最大支路计算,shotcut也一样所以不会改变感受野
  • ReLU, BN,dropout等元素级操作不会影响感受野
  • 全局步进等于经过所有层的步进累乘,即 ∏ n = 0 i s n \displaystyle\prod_{n=0}^{i} s_{n} n=0isn
  • 经过的所有层所加padding都可以等效加在输入图像,等效值P,直接用卷积的输入输出公式
    f o u t = ( f i n − k + 2 ∗ p ) / s + 1 f_{out}=(f_{in}-k+2*p)/s+1 fout=(fink+2p)/s+1
    反推出P即可

两种计算感受野的方法

从前往后

  • 我们来计算一个简单的例子,先学会计算感受野,再来分析复杂的网络。
    在这里插入图片描述
    根据上面的规律,我们可以计算:
    r 0 = 1 , s 0 = 1 r_{0}=1,s_{0}=1 r0=1s0=1
    r 1 = 3 r_{1}=3 r1=3
    r 2 = 3 + ( 2 − 1 ) ∗ 1 = 4 r_{2}=3+(2-1)*1=4 r2=3+(21)1=4(r2即对应pool1层)
    r 3 = 4 + ( 3 − 1 ) ∗ 2 = 8 r_{3}=4+(3-1)*2=8 r3=4+(31)2=8
    r 4 = 8 + ( 2 − 1 ) ∗ 2 = 10 r_{4}=8+(2-1)*2=10 r4=8+(21)2=10(r4即对应pool2层)
    r 5 = 10 + ( 3 − 1 ) ∗ 4 = 18 r_{5}=10+(3-1)*4=18 r5=10+(31)4=18
    r 6 = 18 + ( 3 − 1 ) ∗ 4 = 26 r_{6}=18+(3-1)*4=26 r6=18+(31)4=26(r6即对应conv4层)
    r 7 = 26 + ( 2 − 1 ) ∗ 4 = 30 r_{7}=26+(2-1)*4=30 r7=26+(21)4=30

从后往前

  • 我们从最后一层的池化层开始计算感受野:
    p o o l 3 : R = 2 (最后一层池化层输出特征图的感受野大小等于卷积核的大小) pool3:R=2(最后一层池化层输出特征图的感受野大小等于卷积核的大小) pool3R=2(最后一层池化层输出特征图的感受野大小等于卷积核的大小)
    c o n v 4 : R = ( 2 − 1 ) ∗ 1 + 3 = 4 。 conv4:R=(2-1)*1+3=4。 conv4R=211+3=4
    c o n v 3 : R = ( 4 − 1 ) ∗ 1 + 3 = 6 。 conv3:R=(4-1)*1+3=6。 conv3R=411+3=6
    p o o l 2 : R = ( 6 − 1 ) ∗ 2 + 2 = 12 。 pool2:R=(6-1)*2+2=12。 pool2R=612+2=12
    c o n v 2 : R = ( 12 − 1 ) ∗ 1 + 3 = 14 。 conv2:R=(12-1)*1+3=14。 conv2R=1211+3=14
    p o o l 1 : R = ( 14 − 1 ) ∗ 2 + 2 = 28 。 pool1:R=(14-1)*2+2=28。 pool1R=1412+2=28
    c o n v 1 : R = ( 28 − 1 ) ∗ 1 + 3 = 30 。 conv1:R=(28-1)*1+3=30。 conv1R=2811+3=30

推导VGG16网络的感受野

结构

在这里插入图片描述

从后往前

在VGG16中:pool5中
pool5:RF=2
conv5_3 :RF=(2-1)*1+3=4
conv5_2 : RF=(4-1)*1+3=6
conv5_2: RF=(6-1)*1+3=8
conv5_1: RF=(8-1)*2+2=16
pool4 : RF=(8-1)*2+2=16
conv4_3: RF=(16-1)*1+3=18
conv4_2: RF=(18-1)*1+3=20
conv4_1 : RF=(20-1)*1+3=22
pool3: RF=(22-1)*2+2=44
conv3_3: RF=(44-1)*1+3=46
conv3_2: RF=(46-1)*1+3=48
conv3_1: RF=(48-1)*1+3=50
pool2: RF=(50-1)*2+2=100
conv2_2: RF=(150-1)*1+3=152
conv2_1: RF=(152-1)*1+3=154
pool1: RF=(154-1)*2+2=208
conv1_2: RF=(208-1)*1+3=210
conv1_1: RF=(210-1)1+3=212

从前往后

conv1_1: RF=3
conv1_2: RF=3+(3-1)*1=5
pool1: RF=5+(2-1)*1=6
conv2_1: RF=6+(3-1)*2=10

后面的数在上图的栏目里都有了,我就不一一计算了,最终结果也是212

感受野大于图片

  • 感受野大于图片怎么理解呢?其实是由于存在padding操作导致的。padding操作对于感受野的意义就相当于扩大图片。扩大后的尺寸可以用我在规律里最后一条提到的公式去计算,相当于去掉所有步骤中的padding操作去计算实际的图片尺寸,这个没有什么意义……只要知道为啥感受野大于图片就好了。

为什么要增大感受野

  • 卷积、池化都有一个重要作用就是增大感受野,为什么感受野这么重要呢?
  • 前面看过感受野的定义,是表示在前几层对应的图像区域的大小,那么为了保证所利用的信息是全局的,而不仅仅是局部信息,我们就应该保证感受野较大。同时,合理计算感受野,可以保证效率,例如,输入图像大小是128*128,如果最后一层的感受野已经可以超过128,我们可以认为在做最后的分类判断时所用到的特征已经涵盖了原始图像所有范围的信息了。如果能够尽可能的降低网络的参数总量,也十分重要。
### 如何通过网络结构或技术方法扩大卷积神经网络的感受野计算机视觉和深度学习领域,感受野(Receptive Field)是一个重要的概念,它定义了一个像素点在网络输出中的影响范围。为了提高模型对更大上下文的理解能力,可以通过多种技术和网络结构调整来实现感受野的扩展。 #### 1. 增加卷积层数 增加卷积层的数量是一种简单而有效的方法来增大感受野。每经过一层卷积操作,当前层的感受野会基于前一层的结果进一步扩展。这种逐层叠加的方式能够逐步覆盖更大的输入区域[^1]。 #### 2. 使用大尺寸卷积核 通常情况下,默认采用的是 \(3 \times 3\) 或者 \(5 \times 5\) 的小尺寸卷积核。然而,如果直接选用较大的卷积核(如 \(7 \times 7\)),则可以在单次运算中显著提升局部特征提取的能力以及对应的感受野大小。不过需要注意的是,这种方法可能会带来更多的参数数量从而加重计算负担[^1]。 #### 3. 应用空洞/扩张卷积 (Dilated/Atrous Convolution) 空洞卷积是在标准二维离散卷积的基础上引入了一种新的采样方式——跳跃式取值。相比普通的连续邻域内的求和乘积累计过程而言,在保持相同分辨率的同时允许更宽广的空间跨度被纳入考虑范围内,进而有效地增加了整体架构的有效接受视野而不必牺牲太多额外资源消耗[^2]。 ```python import torch.nn as nn class DilatedConvBlock(nn.Module): def __init__(self, in_channels, out_channels, kernel_size=3, dilation=2): super(DilatedConvBlock, self).__init__() padding = dilation * (kernel_size - 1) // 2 self.conv = nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size, stride=1, padding=padding, dilation=dilation) def forward(self, x): return self.conv(x) ``` #### 4. 利用池化操作(Pooling Operations) 最大池化(Max Pooling)或者平均池化(Average Pooling)等下采样的手段也可以帮助我们获取到更加宏观层面的信息表示形式。尽管这些变换本身并不会改变原有的权重连接关系模式,但由于减少了空间维度上的粒度级别,因此间接实现了对于原始数据分布特性的全局把握程度增强效果[^1]。 #### 5. 结合多尺度特征融合(Multi-Scale Feature Fusion) 除了单纯依赖单一路径之外,还可以尝试将来自不同层次级别的抽象表达组合起来共同作用于最终决策阶段之中。比如FPN(Feature Pyramid Network), PANet(Path Aggregation Network)都是此类思想的具体体现版本之一;它们通过对高低级语义信息之间的交互补充机制设计达到了兼顾细部刻画精度与背景关联认知两方面需求的目的[^2]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CtrlZ1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值