空洞卷积(Atrous Convolution)通过在卷积核采样点间插入间隔扩大感受野,参数量不变。
基本原理
空洞卷积(又称扩张卷积)通过**空洞率(dilation rate, )**控制采样点间隔。
公式:
时退化为标准卷积。
直观理解
以 卷积核为例:
| 空洞率 | 感受野 |
|---|---|
| (标准卷积) | |
参数量和计算量保持不变。
优点
| 优点 | 说明 |
|---|---|
| 扩大感受野 | 无需堆叠层 |
| 参数不变 | 只改变采样间隔 |
| 多尺度特征 | 不同空洞率提取不同尺度 |
| 保持分辨率 | 避免下采样丢失空间信息 |
限制
| 问题 | 解决方案 |
|---|---|
| 网格效应 | 结合多种空洞率(ASPP) |
| 小目标不敏感 | 与标准卷积搭配使用 |
应用场景
语义分割
DeepLab 系列使用 ASPP(Atrous Spatial Pyramid Pooling):
- 并行使用空洞率 的卷积
- 捕捉多尺度上下文特征
自然语言处理
扩大上下文窗口,捕捉长距离依赖。
目标检测
增强小目标检测性能。
PyTorch 实现
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 使用。