可分离卷积
✅ 1. 前言
上一篇我们讲了标准卷积和转置卷积,知道了卷积的“基本操作”和“逆操作”。但在 移动端、嵌入式设备、实时推理 中,标准卷积计算量太大,必须轻量化。
可分离卷积(Depthwise Separable Convolution)就是典型的轻量化卷积核心积木,被 MobileNet、EfficientNet、Xception 等网络广泛采用。
本篇将深入讲:
-
可分离卷积原理
-
计算量分析
-
MobileNet 系列演化
-
PyTorch 实战
-
优缺点与适用场景
✅ 2. 回顾:标准卷积计算量
输入特征图:H×W×Cin
输出特征图:H×W×Cout
卷积核:K×K
-
参数量:
K*K*Cin*Cout -
FLOPs:
H*W*K*K*Cin*Cout
当 Cin、Cout 很大时,计算量爆炸。
✅ 3. 可分离卷积原理
核心思想:把标准卷积分解成 两步:
-
Depthwise Conv(逐通道卷积)
每个输入通道独立卷积,输出通道 = 输入通道数-
参数量:
K*K*Cin -
FLOPs:
H*W*K*K*Cin
-
-
Pointwise Conv(1×1 卷积)
将 Depthwise 输出做通道融合-
参数量:
Cin*Cout -
FLOPs:
H*W*Cin*Cout
-
总参数量 & FLOPs = Depthwise + Pointwise
与标准卷积相比,可以降低 约 8~9 倍计算量(3×3卷积为例)
✅ 4. MobileNet 系列演化
| 系列 | 特点 | 改进 |
|---|---|---|
| MobileNetV1 | 基于 DW + PW | 第一次大规模应用 |
| MobileNetV2 | 引入 Inverted Residual + Linear Bottleneck | 保持轻量化 + 增强表达能力 |
| MobileNetV3 | 引入 SE注意力 + NAS搜索 | 精度和速度兼顾 |
设计思路都是:可分离卷积 → DW处理空间 → PW融合通道 → 加轻量化策略
✅ 5. PyTorch 实战
5.1 简单 DW + PW 实现
import torch
import torch.nn as nnclass DepthwiseSeparableConv(nn.Module):def __init__(self, in_ch, out_ch, kernel_size=3, stride=1, padding=1):super().__init__()self.dw = nn.Conv2d(in_ch, in_ch, kernel_size, stride,padding, groups=in_ch, bias=False)self.pw = nn.Conv2d(in_ch, out_ch, 1, bias=False)self.bn = nn.BatchNorm2d(out_ch)self.relu = nn.ReLU(inplace=True)def forward(self, x):x = self.dw(x)x = self.pw(x)x = self.bn(x)return self.relu(x)x = torch.randn(1, 32, 112, 112)
model = DepthwiseSeparableConv(32, 64)
print(model(x).shape) # torch.Size([1, 64, 112, 112])
5.2 与标准卷积对比(参数量 & FLOPs)
# 标准卷积
conv_std = nn.Conv2d(32, 64, 3, padding=1)
x_std = conv_std(x)
可分离卷积参数量约 1/9,FLOPs 约 1/9,精度略降但效率极高。
✅ 6. 优缺点总结
| 优点 | 缺点 |
|---|---|
| 极大降低计算量和参数量 | 特征融合能力略低于标准卷积 |
| 支持轻量化网络部署 | 对小模型任务可能需要BN/SE等增强 |
| 易于与残差结构结合 | 单独使用时精度可能略低 |
✅ 7. 适用场景
-
移动端/嵌入式设备(手机、Jetson、Raspberry Pi)
-
实时推理任务(目标检测、分类、分割)
-
轻量化网络设计(MobileNet、EfficientNet、ShuffleNet)
不适用场景:
-
模型容量充足且追求极致精度
-
需要大范围通道交互的复杂任务
✅ 8. 小结
可分离卷积是 轻量化卷积的核心积木,其价值在于:
-
解耦空间卷积和通道卷积
-
降低计算量 & 参数量
-
可与各种轻量化网络策略结合
