【深度学习|空洞卷积】Dilated Convolution是个什么神奇的存在?
Multi-scale context aggregation with dilated convolutions
论文地址:https://arxiv.org/pdf/1511.07122v2
空洞卷积 (Dilated Convolution) :
空洞卷积的定义
- 空洞卷积(Dilated Convolution)是传统卷积的一种变体,其关键特点是在卷积核之间插入一定数量的“空洞”,从而扩大感受野而不增加计算量。它通过引入一个膨胀率(dilation rate)来决定卷积核中元素之间的跳跃步长。膨胀率是指卷积核中的元素之间相隔的步数。例如,膨胀率为1表示普通卷积,膨胀率为2表示卷积核中每个元素之间跳过1个像素来执行卷积操作。
空洞卷积的公式表示
- 在普通卷积中,卷积核的感受野是固定的,大小为
k
×
k
k×k
k×k。而空洞卷积的感受野通过引入膨胀率
d
d
d,有效地将卷积核的感受野扩展为
k
e
f
f
e
c
t
i
v
e
=
k
+
(
k
−
1
)
(
d
−
1
)
k_{effective}=k+(k-1)(d-1)
keffective=k+(k−1)(d−1),其中k是卷积核的大小,d是膨胀率。
例如: - 对于 3 × 3 3×3 3×3的卷积核,当 d = 1 d=1 d=1时,卷积操作相当于普通的卷积;
- 当 d = 2 d=2 d=2时,卷积核的感受野扩大为 5 × 5 5×5 5×5,但实际的卷积操作仍然使用9个参数,而不增加计算量。
空洞卷积的主要作用
- 空洞卷积主要通过膨胀感受野而保留分辨率,适用于需要对较大范围的信息进行处理的任务。它的主要作用包括:
(1)扩大感受野:通过膨胀率,空洞卷积能够有效扩大感受野,使得网络能够从更大范围的特征中提取信息,适合处理长距离依赖的场景,如图像语义分割或时间序列任务。
(2)保持空间分辨率:空洞卷积可以在不增加池化层的前提下扩大感受野,因此可以保持特征图的分辨率。相比于池化层,它不会丢失位置信息。
(3)减少计算开销:相比增加卷积核的尺寸或通过下采样来扩大感受野,空洞卷积无需额外增加卷积参数,因此更加高效。
空洞卷积 (Dilated Convolution)的应用场景:
-
图像语义分割:在语义分割任务中,需要精确地定位图像中的物体并进行分类。空洞卷积通过扩展感受野,可以在不降低分辨率的情况下,捕获更多的上下文信息。因此,空洞卷积在语义分割模型中广泛应用,如 DeepLab 系列网络。
-
时间序列建模:在处理时间序列或自然语言处理任务时,空洞卷积能够通过引入膨胀率捕捉长距离的依赖关系。这对于像 WaveNet 这样的任务非常重要,WaveNet 使用空洞卷积来实现更大时间窗口内的感知。
-
对象检测:在对象检测任务中,空洞卷积可以帮助网络更好地识别多尺度的物体,特别是当物体较大或较小时,通过调整膨胀率,可以让网络在多种尺度下进行信息提取。
空洞卷积 (Dilated Convolution)的代码实现:
- 以下是使用 TensorFlow 和 PyTorch 实现空洞卷积的代码示例。
TensorFlow 实现
import tensorflow as tf
from tensorflow.keras import layers
# 创建一个空洞卷积层,输入通道为64,输出通道为128,卷积核大小为3x3,膨胀率为2
input_tensor = tf.random.normal([1, 64, 64, 64]) # 输入形状为 (batch_size, height, width, channels)
dilated_conv = layers.Conv2D(128, kernel_size=3, strides=1, padding='same', dilation_rate=2)
# 通过空洞卷积处理输入
output_tensor = dilated_conv(input_tensor)
print(output_tensor.shape) # 输出形状为 (1, 64, 64, 128)
PyTorch 实现
import torch
import torch.nn as nn
# 创建一个空洞卷积层,输入通道为64,输出通道为128,卷积核大小为3x3,膨胀率为2
input_tensor = torch.randn(1, 64, 64, 64) # 输入形状为 (batch_size, channels, height, width)
dilated_conv = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=2, dilation=2)
# 通过空洞卷积处理输入
output_tensor = dilated_conv(input_tensor)
print(output_tensor.shape) # 输出形状为 (1, 128, 64, 64)
参数解释
-
k e r n e l kernel kernel_ s i z e = 3 size=3 size=3:卷积核的大小为 3 × 3 3×3 3×3
-
d i l a t i o n dilation dilation_ r a t e = 2 rate=2 rate=2(TenserFlow)或 d i l a t i o n = 2 dilation=2 dilation=2(PyTorch):膨胀率为 2 2 2,意味着卷积核元素之间跳过一个像素,从而有效扩展感受野
-
p a d d i n g = ′ s a m e ′ padding='same' padding=′same′(TenserFlow)或者 p a d d i n g = 2 padding=2 padding=2(PyTorch):保持输入输出的空间大小不变
空洞卷积 (Dilated Convolution)的总结与作用:
-
扩大感受野:空洞卷积通过膨胀卷积核,在不增加参数量的前提下显著扩大了感受野,这使得它非常适合需要全局特征提取的任务,如语义分割和对象检测。
-
保留分辨率:与池化层不同,空洞卷积可以在保持特征图分辨率的同时扩大感受野,从而在诸如语义分割的任务中提高精度。
-
高效处理上下文信息:空洞卷积特别适合需要捕获长距离依赖的任务,如序列建模和图像处理中的上下文理解。
-
参数高效:相比直接增大卷积核或通过下采样层扩大感受野,空洞卷积在参数量和计算量上更具优势,因此非常适合大规模的深度网络。
空洞卷积 (Dilated Convolution)的实际应用:
-
DeepLab 系列:DeepLab 网络在其特征提取模块中大量使用了空洞卷积,以扩大感受野、增强特征提取能力,并用于语义分割任务。
-
WaveNet:WaveNet 是一个语音生成模型,使用空洞卷积来捕捉长时间依赖,从而在不增加计算复杂度的情况下处理大量的音频数据。
-
对象检测和实例分割:空洞卷积被广泛应用于检测和分割任务中,能够帮助模型在多尺度下更好地理解图像中的物体。