一、空洞卷积的基础原理
空洞卷积(Dilated Convolution) 是一种改进的卷积操作,通过在卷积核中引入'空洞'来扩大感受野。想象你通过一个 3x3 的窗口看图片,空洞卷积允许窗口跳过某些像素,比如跳过 1 个像素,实际覆盖 5x5 的区域,但参数量不变。

1. 传统卷积的短板
在聊空洞卷积之前,我们先看看传统卷积神经网络(CNN)是怎么工作的,以及它在某些场景下有哪些不足。传统卷积的做法是用一个固定大小的卷积核在输入图像上滑动,逐个区域地提取特征。例如,一个 3x3 的卷积核在图像上滑动,每次生成一个新的特征值,形成特征图。

这种方法在很多视觉任务里效果很好,但也有些让人头疼的地方。
- 感受野有限:传统卷积能看到的区域(也就是感受野)取决于卷积核的大小和网络的层数。想看到更大的范围,要么堆更多层,要么用更大的卷积核。感受野是卷积核能看到的输入区域大小。对于 3x3 的核,覆盖范围小;要看更大的区域,要么用更大核,要么加深网络层数,但这都会显著增加计算量和参数量,模型变得臃肿。
2. 空洞卷积的巧妙之处
空洞卷积通过在每个卷积核元素之间插入零(即'空洞')来解决上述问题。它可以在不增加参数量的情况下,以指数级扩大感受野。

二、空洞卷积的架构
1. 输入层
输入层接收原始数据,通常经过归一化处理。对于时序数据如 PAMAP2,输入形状通常为 (Batch_Size, Channels, Time_Steps)。
2. 空洞卷积模块
2.1 空洞卷积层
核心组件是带有膨胀率(Dilation Rate)参数的卷积层。膨胀率决定了卷积核元素之间的间隔。当膨胀率为 1 时,等同于普通卷积;膨胀率为 2 时,中间隔 1 个像素。
2.2 批归一化和激活
为了加速训练并防止梯度消失,通常在卷积层后接批归一化(Batch Normalization)和激活函数(如 ReLU)。
3. 整体结构
整体网络通常由多个空洞卷积块堆叠而成,随着层数增加,膨胀率呈指数增长(如 1, 2, 4, 8...),从而获得极大的感受野。
三、代码实现详解
以下使用 PyTorch 框架展示空洞卷积的实现细节。
1. 代码分析
1.1 类的初始化 (__init__)
import torch
import torch.nn as nn
(nn.Module):
():
(DilatedConvNet, ).__init__()
.conv = nn.Conv1d(in_channels, out_channels, kernel_size,
padding=(kernel_size - ) * dilation_rate // ,
dilation=dilation_rate)
.bn = nn.BatchNorm1d(out_channels)
.relu = nn.ReLU()
():
.relu(.bn(.conv(x)))


