张芷铭的个人博客

空洞卷积(Atrous Convolution)通过在卷积核采样点间插入间隔扩大感受野,参数量不变。

基本原理

空洞卷积(又称扩张卷积)通过**空洞率(dilation rate, $r$)**控制采样点间隔。

公式

$$y[i] = \sum_k x[i + r \cdot k] \cdot w[k]$$

$r=1$ 时退化为标准卷积。

直观理解

以 $3\times3$ 卷积核为例:

空洞率感受野
$r=1$$3\times3$(标准卷积)
$r=2$$5\times5$
$r=3$$7\times7$

参数量和计算量保持不变。

优点

优点说明
扩大感受野无需堆叠层
参数不变只改变采样间隔
多尺度特征不同空洞率提取不同尺度
保持分辨率避免下采样丢失空间信息

限制

问题解决方案
网格效应结合多种空洞率(ASPP)
小目标不敏感与标准卷积搭配使用

应用场景

语义分割

DeepLab 系列使用 ASPP(Atrous Spatial Pyramid Pooling)

  • 并行使用空洞率 $1, 6, 12, 18$ 的卷积
  • 捕捉多尺度上下文特征

自然语言处理

扩大上下文窗口,捕捉长距离依赖。

目标检测

增强小目标检测性能。

PyTorch 实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import torch.nn as nn

# 空洞率=2 的卷积层
conv = nn.Conv2d(
    in_channels=3,
    out_channels=16,
    kernel_size=3,
    dilation=2  # 空洞率
)

# ASPP 模块
class ASPP(nn.Module):
    def __init__(self, in_ch, out_ch, rates=[1, 6, 12, 18]):
        super().__init__()
        self.convs = nn.ModuleList([
            nn.Conv2d(in_ch, out_ch, 3, padding=r, dilation=r)
            for r in rates
        ])

    def forward(self, x):
        return torch.cat([conv(x) for conv in self.convs], dim=1)

总结

空洞卷积在不增加参数的情况下扩大感受野,特别适合需要全局信息的密集预测任务。需注意网格效应,通常结合 ASPP 使用。

Comments