MobileNet 学习笔记
- MobileNet V1 & V2的学习内容可见视频:https://www.bilibili.com/video/BV1yE411p7L7/
- MobileNet V3的学习内容可见视频:https://www.bilibili.com/video/BV1GK4y1p7uE/
一、MobileNet 概述
提出时间: 2017年
提出背景:
传统卷积神经网络(CNN)虽然性能强大,但计算量和参数量庞大,难以在移动端或嵌入式设备上部署。
目标:
在保持较高准确率的同时,显著降低模型参数量与运算量。
核心思想:
- 使用 Depthwise Separable Convolution(深度可分离卷积) 来减少计算量。
- 引入两个可调超参数:
- α(Width Multiplier):控制卷积核数量(网络宽度)。
- β(Resolution Multiplier):控制输入图像尺寸(分辨率)。
二、MobileNet v1 网络详解
1. Depthwise Convolution(DW卷积)
传统卷积:
- 输入:3通道图像。
- 卷积核:假设有4个,每个卷积核包含3个通道。
- 每个卷积核会对所有输入通道进行卷积并融合结果。
- 输出特征图通道数 = 卷积核数量(即4)。
- 结论:存在通道间特征融合。
DW卷积:
- 每个输入通道只使用一个卷积核进行卷积。
- 不进行通道融合。
- 输出通道数与输入通道数相同。
- 结论:显著减少计算量,但缺乏通道融合能力。
2. Depthwise Separable Convolution(深度可分离卷积)
由两部分组成:
- Depthwise Convolution (DW): 对每个输入通道单独卷积。
- Pointwise Convolution (PW): 使用 1×1 卷积核,将DW卷积结果在通道维度进行线性组合,实现通道间的信息融合。
优点:
- 大幅减少计算量与参数量。
- 能保持较高精度。
3. 与普通卷积的计算量对比
假设输入特征大小为 ( $D_F \times D_F \times M $),卷积核大小为 ( $D_K \times D_K$ ),输出通道为 ($ N $)。
- 普通卷积计算量: $ D_K^2 \times M \times N \times D_F^2$
- 深度可分离卷积计算量:$ D_K^2 \times M \times D_F^2 + M \times N \times D_F^2$
- 相比之下,约减少 8~9 倍 计算量。
4. 超参数 α 与 β
| 参数 | 含义 | 作用 |
|---|---|---|
| α (Width Multiplier) | 卷积核个数缩放系数 | 控制网络宽度。α越小,通道数越少,参数量越小。 |
| β (Resolution Multiplier) | 输入分辨率缩放系数 | 控制输入图像尺寸。β越小,计算量越小。 |
示例:
- α = 1.0,输入 224×224,准确率 70.6%。
- 降低 α 或 β 会略降准确率,但显著减小模型规模。
5. v1 的不足
- Depthwise 卷积的部分卷积核可能废掉,即部分参数趋近于 0,导致特征提取不充分。 v2 版本针对该问题进行了改进。
三、MobileNet v2 网络详解(2018)
MobileNet v2 在 v1 的基础上进一步优化,主要引入:
- Inverted Residual(倒残差结构)
- Linear Bottleneck(线性瓶颈)
1. Inverted Residual(倒残差结构)
传统残差结构(ResNet):
两头大,中间小
1×1 降维 → 3×3 卷积 → 1×1 升维
激活函数:ReLU
倒残差结构:
两头小,中间大
1×1 升维 → 3×3 DW卷积 → 1×1 降维
激活函数:ReLU6(范围 [0, 6])
特点:
- 更适合轻量化网络。
- 保留低维特征表达能力。
- 更高效地利用通道信息。
2. Linear Bottleneck(线性瓶颈)
在倒残差结构的最后一层(1×1降维卷积)不使用ReLU激活函数,而采用线性激活函数。
原因:ReLU在低维空间会导致特征丢失,线性激活能更好地保留信息。
论文示例(Figure 1):输入经过随机矩阵 T、ReLU、T⁻¹ 后,低维空间的特征还原效果极差,说明非线性激活会破坏低维信息。
3. Shortcut 连接的条件
- 当 stride = 1 且输入输出 shape 相同时,添加 shortcut 连接。
- 当 stride ≠ 1 时(例如下采样层),不使用 shortcut。
4. 网络架构说明
MobileNet v2 网络由多个 bottleneck 模块组成。
每个模块包含:
- t:扩展因子(expand ratio)
- c:输出通道数
- n:重复次数
- s:步幅(stride)
注意:
- 当模块重复多次时,只有第一个 stride=2(下采样),其余为 stride=1。
- 最后一层输出通道数取决于任务类别数(例如 ImageNet 为 1000 类)。
5. MobileNet v2 在视觉任务中的表现
- 图像分类(ImageNet):
当 α=1.4 时,Top-1 准确率 74.7%。 - 目标检测(Object Detection):
与 SSDLite 结合后,mAP 达 22.1。
6. 对比表
| 模型版本 | 核心改进 | 激活函数 | 连接结构 | 性能特点 |
|---|---|---|---|---|
| v1 | Depthwise Separable Conv, α, β | ReLU | 无 | 参数量、计算量显著下降 |
| v2 | Inverted Residual, Linear Bottleneck | ReLU6 + Linear | Shortcut(stride=1时) | 精度更高,效率更优 |
- MobileNet 的设计是:在保持足够表达能力的同时,最大限度地压缩计算量。
- Depthwise + Pointwise 分解体现了分而治之的思想。
- v2 的倒残差结构本质上在平衡“信息压缩”和“信息流通”之间的矛盾。
四、MobileNet v3 网络详解(2019)
MobileNet v3 是在 v2 的基础上,通过 网络结构搜索(NAS) 与 注意力机制(SE模块) 自动优化得到的版本。
1. 设计动机
v2 已经足够轻量,但仍存在以下问题:
- 模块结构固定,未针对特定任务自动优化;
- 缺少全局特征建模能力;
- 激活函数 ReLU6 在某些场景下欠表达。
因此 v3 引入三大改进:
- NAS 自动搜索最优结构;
- SE(Squeeze-and-Excitation)模块增强特征通道表达;
- 新的激活函数 h-swish,提高性能与可导性。
2. 核心模块与创新点
(1) h-swish 激活函数
传统 ReLU6 在低值区“死亡神经元”问题严重。 v3 采用 h-swish (hard-swish) 激活函数,兼具可导性与轻量性:
$\text{h-swish}(x) = x \times \frac{\text{ReLU6}(x + 3)}{6}$
优点:
- 在 [−3, 3] 区间平滑可导;
- 可近似 swish(x) = x * sigmoid(x),但计算更快;
- 提升特征非线性表达能力。
(2) SE 注意力机制(Squeeze-and-Excitation)
在每个 bottleneck 模块中加入 SE Block,实现通道注意力调节。
流程:
- Squeeze: 全局平均池化,得到通道级统计信息。
- Excitation: 两层全连接网络(带 ReLU 与 Sigmoid)生成权重。
- Scale: 将权重与原特征通道相乘,实现重要通道增强。
作用:
显著提升特征选择性,使模型关注关键特征维度。
(3) 改进的 Inverted Residual 结构
v3 继续使用倒残差结构,但调整了:
- 是否启用 SE 模块;
- 激活函数类型(ReLU 或 h-swish);
- 扩展比例(expansion ratio);
- 通道数量按 NAS 搜索结果动态分配。
(4) 网络结构搜索(NAS)
使用 Google AutoML 工具自动搜索网络配置:
- 目标函数: 准确率 / 延迟比值(accuracy-latency trade-off);
- 搜索空间: block 类型、通道数、步幅、是否加 SE、激活函数类型。