AI-深度学习

嵌入式视觉模型进阶 04:通道注意力与 MobileNetV3

展开合集目录
  1. 嵌入式视觉模型进阶 01:怎样读懂一个实际模型
  2. 嵌入式视觉模型进阶 02:卷积进阶:分组、深度、逐点与空洞卷积
  3. 嵌入式视觉模型进阶 03:MobileNet:深度可分离卷积与倒残差
  4. 嵌入式视觉模型进阶 04:通道注意力与 MobileNetV3
  5. 嵌入式视觉模型进阶 05:ShuffleNet:通道拆分与重排
  6. 嵌入式视觉模型进阶 06:结构重参数化:训练分支怎样合为一个卷积
  7. 嵌入式视觉模型进阶 07:Backbone、Neck、Head 与多尺度特征
  8. 嵌入式视觉模型进阶 08:FPN 与 PAN:怎样融合不同尺度的信息
  9. 嵌入式视觉模型进阶 09:检测头:分类、位置与置信度
  10. 嵌入式视觉模型进阶 10:检测训练:标签分配与损失计算
  11. 嵌入式视觉模型进阶 11:完整 YOLOv8 推理:从图片到原图目标框
  12. 嵌入式视觉模型进阶 12:训练自己的检测器与错误分析
  13. 嵌入式视觉模型进阶 13:检测器导出对照与其他结构路线
  14. 嵌入式视觉模型进阶 14:跟踪基础:运动预测、匹配与轨迹生命周期
  15. 嵌入式视觉模型进阶 15:ByteTrack 思路:用低分框恢复已有轨迹
  16. 嵌入式视觉模型进阶 16:外观特征与 ReID:怎样比较两个目标
  17. 嵌入式视觉模型进阶 17:目标跟随:从轨迹到云台控制接口
  18. 嵌入式视觉模型进阶 18:视频系统:队列、时间戳与异步流水线
  19. 嵌入式视觉模型进阶 19:人脸处理流程:检测、关键点与对齐
  20. 嵌入式视觉模型进阶 20:特征识别:人脸向量、相似度与阈值
  21. 嵌入式视觉模型进阶 21:人体关键点与姿态估计
  22. 嵌入式视觉模型进阶 22:OCR 检测:从文字区域到矫正图片
  23. 嵌入式视觉模型进阶 23:OCR 识别:序列模型与 CTC
  24. 嵌入式视觉模型进阶 24:完整 OCR 流程与识别错误分析
  25. 嵌入式视觉模型进阶 25:轻量语义分割与实例分割
  26. 嵌入式视觉模型进阶 26:工业异常检测:缺陷样本少时怎么办
  27. 嵌入式视觉模型进阶 27:深度估计与图像恢复:两个专题入口
  28. 嵌入式视觉模型进阶 28:面向 NPU 的计算图与算子兼容
  29. 嵌入式视觉模型进阶 29:量化、蒸馏与剪枝的实际取舍
  30. 嵌入式视觉模型进阶 30:综合项目:检测、跟踪与云台跟随验收
嵌入式视觉模型进阶 04:通道注意力与 MobileNetV3的封面

第 4 / 30 课。 前置:上一课。本篇的运行范围以实验说明和验证记录为准,构造样例不代表真实任务精度或板端性能。

一个通道应当占多大权重

SE 先对 H、W 做全局平均,得到 [N,C,1,1] 描述,再经过降维、非线性和升维产生通道权重。权重与原特征逐通道相乘,空间位置共享该通道的缩放系数。它没有为每个像素生成一份独立注意力,也没有改变通道数。

降维比例描述隐藏层宽度,不是必须严格整除的数学限制;工程实现往往还会对齐到设备友好的通道数。本课使用 max(1,C//4),避免小通道时变成零。

Hard-Swish 为什么容易拆解

h-swish(x)=x×ReLU6(x+3)/6。当 x≤−3 时为零;x≥3 时为 x;中间为二次段。它与 Swish 的曲线不同,不能直接用一个替换另一个而宣称等价。Hard-Sigmoid 常用于门控,本课取 ReLU6(x+3)/6。

MobileNetV3 组合了多种模块选择。本课实现的是其中的关键组件,不是重新宣称实现了完整搜索过程或完整 V3 网络。完整模型可用第 1 课的方法逐层审查。

实验与工程判断

脚本手写 Hard-Swish 并与框架函数逐值比较,再检查 SE 权重范围和输出形状。将输入设为全零,观察门控是否必定为零;答案是否定的,门控取决于学习参数与偏置。

NPU 可能把激活识别成融合算子,也可能分解为 Add、Clip、Mul 等节点。应查看转换报告与实际耗时;模块名称里带“轻量”不是兼容性保证。

课后交付

画出 [N,C,H,W]→[N,C,1,1]→[N,C/r,1,1]→[N,C,1,1],注明最后乘法的广播方向。将平均池化误写为只沿 W 归约,比较它变成了怎样的空间依赖。

配套实验与运行记录

实验:通道注意力与 MobileNetV3

查看完整代码:main.py
"""实现 SE 和 Hard-Swish,检查注意力广播以及激活的分段行为。"""

import torch
from torch import nn


class SE(nn.Module):
    def __init__(self, c):
        super().__init__()
        self.gate = nn.Sequential(
            nn.AdaptiveAvgPool2d(1),
            nn.Conv2d(c, max(1, c // 4), 1),
            nn.ReLU(),
            nn.Conv2d(max(1, c // 4), c, 1),
            nn.Hardsigmoid(),
        )

    def forward(self, x):
        return x * self.gate(x)


def main():
    torch.manual_seed(7)
    torch.set_num_threads(2)
    x = torch.linspace(-6, 6, 25)
    manual = x * torch.clamp(x + 3, 0, 6) / 6
    torch.testing.assert_close(manual, nn.functional.hardswish(x))
    net = SE(16)
    features = torch.randn(2, 16, 8, 8)
    g = net.gate(features)
    assert g.shape == (2, 16, 1, 1) and bool(((g >= 0) & (g <= 1)).all())
    y = net(features)
    assert y.shape == features.shape
    print("gate shape", list(g.shape), "range", g.min().item(), g.max().item())
    print("h-swish equality passed; output", list(y.shape))


if __name__ == "__main__":
    main()
下载代码

在项目根目录执行;下载包解压后,在解压目录执行 python3 main.py。

cd 'content/posts/AI-深度学习/嵌入式视觉模型进阶/04-通道注意力与 MobileNetV3/code' && python3 main.py

在本篇代码目录执行 python3 main.py。依赖安装、可选入口见包内 README.md;实际运行结果见 verification.md。下载包包含本课使用的辅助模块与样例。

参考与进一步阅读

原始论文或官方文档用于核对结构、接口和适用范围。本篇代码是围绕教学目标编写的最小实验;除明确注明的完整入口外,不视为对应论文模型的完整复现。


完整进阶目录 · 入门系列 · 上一篇 · 下一篇