空洞卷积的超详细解释

什么是空洞卷积

Dilated/Atrous Convolution(中文叫做空洞卷积或者膨胀卷积) 或者是 Convolution with holes 从字面上就很好理解,是在标准的 convolution map 里注入空洞,以此来增加 reception field。相比原来的正常convolution,dilated convolution 多了一个 hyper-parameter 称之为 dilation rate,指的是kernel的间隔数量(e.g. 正常的 convolution 是 dilatation rate 1)。

  • 下面分别是普通卷积空洞卷积的图解例子
    在这里插入图片描述
    在这里插入图片描述
  • 看上去,空洞卷积的操作十分简单,并没有与普通卷积差别太大。不过光理解他的工作原理还是远远不够的,要充分理解这个概念我们得重新审视卷积本身,并去了解他背后的设计直觉。

为什么需要空洞卷积

卷积的问题

  • 在赢得其中一届ImageNet比赛里VGG网络的文章中,他最大的贡献并不是VGG网络本身,而是他对于卷积叠加的一个巧妙观察。
  • 这里意思是 7 x 7 的卷积层的正则等效于 3 个 3 x 3 的卷积层的叠加。而这样的设计不仅可以大幅度的减少参数,其本身带有正则性质的 convolution map 能够更容易学一个 generlisable, expressive feature space。这也是现在绝大部分基于卷积的深层网络都在用小卷积核的原因。
  • 主要问题有:
    1. Up-sampling / pooling layer (e.g. bilinear interpolation) is deterministic. (a.k.a. not learnable)内部数据结构丢失;
    2. 空间层级化信息丢失。
    3. 小物体信息无法重建 (假设有四个pooling layer 则 任何小于 2^4 = 16 pixel 的物体信息将理论上无法重建。)
    在这样问题的存在下,语义分割问题一直处在瓶颈期无法再明显提高精度, 而 dilated convolution 的设计就良好的避免了这些问题。
  • 在图像分割领域,图像输入到CNN(典型的网络比如FCN[3])中,FCN先像传统的CNN那样对图像做卷积再pooling,降低图像尺寸的同时增大感受野,但是由于图像分割预测是pixel-wise的输出,所以要将pooling后较小的图像尺寸upsampling到原始的图像尺寸进行预测(upsampling一般采用deconv反卷积操作,deconv可参见知乎答案如何理解深度学习中的deconvolution networks?),之前的pooling操作使得每个pixel预测都能看到较大感受野信息。因此图像分割FCN中有两个关键,一个是pooling减小图像尺寸增大感受野,另一个是upsampling扩大图像尺寸。在先减小再增大尺寸的过程中,肯定有一些信息损失掉了,那么能不能设计一种新的操作,不通过pooling也能有较大的感受野看到更多的信息呢?答案就是dilated conv。

空洞卷积的好处

  • 扩大感受野:在deep net中为了增加感受野且降低计算量,总要进行降采样(pooling或s2/conv),这样虽然可以增加感受野,但空间分辨率降低了。为了能不丢失分辨率(持怀疑态度),且仍然扩大感受野,可以使用空洞卷积。这在检测,分割任务中十分有用。一方面感受野大了可以检测分割大目标,另一方面分辨率高了可以精确定位目标。
  • 捕获多尺度上下文信息:空洞卷积有一个参数可以设置dilation rate,具体含义就是在卷积核中填充dilation rate-1个0,因此,当设置不同dilation rate时,感受野就会不一样,也即获取了多尺度信息。多尺度信息在视觉任务中相当重要啊。

总结

  • 其实说白了,就是池化可以扩大感受野,可以降低数据维度,可以减少计算量,但是会损失信息,而对于语义分割来说,这造成了发展瓶颈。而空洞卷积可以在扩大感受野的情况下不损失信息,但其实,空洞卷积的确没有损失信息,但是却没有用到所有的信息,下面我们就要讲空洞卷积的一些问题。

空洞卷积存在的问题

潜在问题 1:The Gridding Effect

  • 空洞卷积的例子:
    在这里插入图片描述
  • 上图解释了空洞卷积存在的问题,从左到右属于top-bottom关系,即左图是最上层的图(其实还少了一张图,最右图是输入图像,向左依次是经过一次kernelsize=3,r=2的空洞卷积之后的结果,最左边的图应该是只有一个红点,这里没画。),三层卷积均为r=2的dilatedConv,可以看出最上层的红色像素的感受野为13。
  • 上图中蓝色方块的深浅代表在某层进行空洞卷积的过程中,该方块参与卷积核运算的次数的多少。很明显,分布并不是均匀的,很多方块参与次数很少。而且很多方块根本没有参与运算(但并不是上述所有的白块都没有参与运算,因为这只是最高层一个点的感受野,它相邻的点的感受野会包含一部分上图的白块,但有一些方块是确实在整个卷积过程中没有参与)
  • 而且,在使用同样尺寸的卷积核的多次卷积中,最终产生的像素点所依赖的输入像素点是不相邻的,是相互独立的。因为空洞卷积得到的某一层的结果中,邻近的像素是从相互独立的子集中卷积得到的,相互之间缺少依赖。这就导致:
    局部信息丢失:由于空洞卷积的计算方式类似于棋盘格式,某一层得到的卷积结果,来自上一层的独立的集合,没有相互依赖,因此该层的卷积结果之间没有相关性,即局部信息丢失。
    远距离获取的信息没有相关性:由于空洞卷积稀疏的采样输入信号,使得远距离卷积得到的信息之间没有相关性,影响分类结果。本来远距离获得信息是件好事,结果却没有相关性(也不能说没有,而是r越大越远越没有相关性,r越小越近越相关)。

潜在问题 2:Long-ranged information might be not relevant.

  • 我们从 dilated convolution 的设计背景来看就能推测出这样的设计是用来获取 long-ranged information。然而光采用大 dilation rate 的信息或许只对一些大物体分割有效果,而对小物体来说可能则有弊无利了。 如何同时处理不同大小的物体的关系,则是设计好 dilated convolution 网络的关键。
  • 总结:简单来说,就是空洞卷积虽然在参数不变的情况下保证了更大的感受野,但是对于一些很小的物体,本身就不要那么大的感受野来说,这是极度不友好的。

解决办法

  • 对于上个 section 里提到的几个问题,图森组的文章对其提出了较好的解决的方法。他们设计了一个称之为 HDC 的设计结构。
  • HDC原则 (Hybrid Dilated Convolution) - 图森组
    混合空洞卷积,在每一层使用不同的rate,把dilatioin rate 变成锯齿形式的也就是不同层之间的dilation不断变化。目标是最后的接收野全覆盖整个区域。
  • 1.叠加卷积的 dilation rate 不能有大于1的公约数。比如 [2, 4, 6] 则不是一个好的三层卷,有些点永远不会被考虑。
  • 2.将 dilation rate 设计成锯齿状结构。例如[1, 2, 3, 1, 2, 3] 循环结构,覆盖了所有点,如上图
  • 3.需要满足一下这个式子,M<=K:
    在这里插入图片描述
    dilation rate是空洞卷积率,记为 ri,就是扩张倍数;K是卷积核尺寸
    举例:对于常见的扩张卷积核大小K=3,如果r=[1,2,5] 则
    在这里插入图片描述
    此时M2=2 ≤ K=3 满足设计要求,设计的示意图如下:
    在这里插入图片描述
  • 上图解释一下,从左往右看,也就是从顶部往下部看,顶部进行size=5的空洞卷积,所用到的蓝点是根据r=2的空洞卷积卷过来的,还原回去就是中间的图,可以看到还是有一些方块是白色的,也就是没有参与运算的,别急,再看这些蓝方块是根据r=1的方块填充的,然后还原,得到最右图,可见所有的输入元素都被参与运算了,使得卷积后的某个像素考虑了感受野内所有的输入像素点,这样就不存在局部信息不完整以及输入像素点之间相关性不强等问题了。
<think>嗯,用户问的是如何设置空洞卷积的空洞率,也就是dilation rate。这个问题看起来需要对空洞卷积的基本概念和实际应用有一定的了解。首先,我需要回忆一下空洞卷积的定义和作用。根据之前的引用,空洞卷积通过向标准卷积注入空洞来扩大感受野,同时保持参数数量不变。关键参数是dilation rate,它决定了卷积核元素之间的间隔。 用户可能想知道如何选择合适的dilation rate,这可能涉及不同应用场景下的权衡。比如,在图像分割或语音处理中,如何调整这个参数才能既扩大感受野又不损失信息。我需要考虑几个方面:任务类型、网络深度、多尺度信息融合以及避免网格效应。 首先,任务类型。比如,图像分割需要大感受野来捕捉上下文,可能需要较大的dilation rate,而检测任务可能更关注局部细节,所以用较小的rate。引用4提到网格效应,当多个空洞卷积叠加时,过大的rate会导致信息不连续,所以需要平衡。 然后,网络深度。深层网络中如果连续使用高dilation rate,可能加剧网格效应,可能需要逐渐递增,比如从1开始,逐步增加到2、4等,或者在深层交替使用不同rate。引用1提到不同rate可以提取多尺度信息,所以可能需要组合使用。 多尺度信息也很重要,比如ASPP结构用不同rate并行处理,结合不同感受野的信息。这可能需要在同一层使用多个不同的rate,然后将结果融合。 还要考虑硬件因素,比如过大的rate可能导致卷积核过大,超过硬件限制,或者计算效率下降。比如,rate=2的3x3卷积实际覆盖7x7区域,但参数还是3x3,但如果rate太大,可能覆盖区域过大,导致有效信息间隔过远。 综合这些因素,可能需要给出一个设置的建议步骤:明确任务需求,初始层用低rate,深层逐步增加,使用混合rate结构,避免连续高rate带来的网格效应,同时实验调整。另外,引用中提到的一些模型,如DeepLab系列,可能作为实际案例参考,比如使用rate=6、12、18等多尺度组合。 用户可能的应用场景是什么?如果是做图像分割,可能需要更关注大感受野和多尺度,而如果是时序数据,可能不同。不过用户没有具体说明,所以需要一般性的建议。 总结起来,回答应该分点说明影响空洞率设置的因素,比如任务类型、网络深度、多尺度融合、网格效应和硬件限制,然后给出设置步骤,并结合实际例子。同时要引用相关的文献,比如引用1、2、4提到的内容,确保回答有依据。</think>### 空洞卷积的空洞率设置方法 空洞率(Dilation Rate)是空洞卷积的核心参数,直接影响感受野大小和特征提取能力。以下是设置空洞率的策略和注意事项: --- #### **1. 根据任务需求选择基础空洞率** - **图像分割任务**:需要大感受野捕捉上下文信息,通常使用较大的空洞率(如$r=2,4,6$),例如DeepLab系列通过叠加不同空洞率实现多尺度感知[^1]。 - **时序数据或语音处理**:关注局部细节时,建议从$r=1$(标准卷积)或$r=2$开始尝试。 --- #### **2. 控制空洞率的增长方式** - **逐层递增策略**:在深层网络中逐步增加空洞率,避免过早丢失局部信息。例如: $$r_1=1 \rightarrow r_2=2 \rightarrow r_3=4$$ 这种方式在WaveNet等时序模型中广泛应用[^2]。 - **混合空洞率结构**:同一层内使用不同空洞率的卷积核并行操作(如ASPP模块),结合多尺度特征。 --- #### **3. 避免网格效应(Gridding Effect)** 当多个高空洞率卷积叠加时,空洞率需满足**互质条件**。例如: - 若使用$r=2$和$r=3$交替堆叠,可覆盖连续感受野; - 若连续使用$r=2$,可能导致采样点重复跳跃,破坏空间连续性[^4]。 --- #### **4. 硬件与计算效率限制** 空洞率过大会导致卷积核实际覆盖范围超出硬件限制(如GPU显存)。例如: - 空洞率$r=4$的$3\times3$卷积核等效于标准$9\times9$核,但参数数量仍为$9$; - 需权衡感受野扩展与计算资源消耗。 --- #### **5. 实验性调参步骤** 1. **基线测试**:从$r=1$(标准卷积)开始,评估模型性能; 2. **逐步扩展**:按$r=2,4,6$逐步增加,观察精度和收敛速度变化; 3. **多尺度组合**:引入混合空洞率模块(如ASPP)优化多尺度特征提取; 4. **验证连续性**:检查输出特征图是否存在网格化伪影,调整空洞率组合[^4]。 --- ### 示例设置(以图像分割为例) ```python # 使用空洞率=2和6的并行卷积层(PyTorch实现) import torch.nn as nn class ASPP(nn.Module): def __init__(self, in_channels): super().__init__() self.conv1 = nn.Conv2d(in_channels, 256, 3, padding=2, dilation=2) # r=2 self.conv2 = nn.Conv2d(in_channels, 256, 3, padding=6, dilation=6) # r=6 self.global_avg_pool = nn.AdaptiveAvgPool2d(1) def forward(self, x): return torch.cat([self.conv1(x), self.conv2(x), self.global_avg_pool(x)], dim=1) ``` ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CtrlZ1

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

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

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

打赏作者

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

抵扣说明:

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

余额充值