振动、动作、电流和声音都包含局部时间模式。相同冲击或周期片段可能出现在窗口不同位置,一维卷积使用同一组卷积核沿时间移动,能够复用参数提取这些局部特征。
深度可分离卷积进一步把时间滤波与通道组合拆开。在输入输出通道较多时,它能够显著减少参数和MACC,但真实速度仍取决于MCU优化内核。
| 1D卷积沿时间共享权重;深度可分离卷积先逐通道滤波,再用1×1卷积混合通道。 |
完成本篇后,你应该能够
卷积核像一个短模板,沿时间轴滑动寻找局部模式。同一个模板在每个位置重复使用,因此参数不随窗口长度增长。 |
图1:深度可分离卷积将时间滤波和通道混合拆成两个阶段
一、局部连接与参数共享适合移动模式
长度为5的卷积核每次只观察相邻5个时间点,并在整个窗口重复使用。它能够检测局部斜率、尖峰或短周期片段,而无需为每个时间位置设置独立权重。
卷积核数量决定输出通道。前几层通常学习基础局部形状,后续层通过更大感受野组合成完整事件。
二、感受野由核、步长和层数共同决定
卷积核太短可能看不到完整周期,核太长会增加计算并接近全连接。池化或步长卷积能够扩大后续层的物理感受野,也会降低时间分辨率。
设计时应把感受野换算成毫秒,与事件持续时间比较。只看网络层数无法判断模型是否覆盖了任务所需时间尺度。
| 普通Conv1D参数 ≈ K × Cin × Cout 深度可分离参数 ≈ K × Cin + Cin × Cout |
三、深度可分离卷积减少通道乘法
普通卷积同时完成时间滤波和通道组合。Depthwise阶段为每个输入通道使用独立时间核,Pointwise阶段再使用1×1卷积组合通道,参数量通常更低。
减少理论MACC不保证同比加速。张量布局、量化重缩放、内核实现和缓存访问都会影响实际时间,应在目标运行时上测量。
表1:三种结构的资源特征
| 结构 | 主要优势 | 主要风险 |
|---|---|---|
| Dense | 简单、适合低维特征 | 长输入参数多 |
| 普通1D Conv | 局部模式与参数共享 | 通道多时MACC增加 |
| 深度可分离1D Conv | 参数与MACC更低 | 依赖优化内核与数据布局 |
四、激活内存仍需要单独控制
轻量卷积减少权重,并不会自动缩小每层输出。早期保持长时间长度并设置很多通道时,中间激活仍可能成为Arena峰值。
可以通过合理步长、池化、通道数和全局平均池化控制激活。每次改结构都同时检查准确率、最大张量和板端时间。
Python/Keras:原始六轴窗口的轻量1D卷积候选模型
import tensorflow as tf |
感受野决定一个输出能利用多长上下文
单层核宽5、步长1的卷积一次看到5个相邻点。堆叠两层核宽5后,第二层一个输出能间接看到9个原始点。步长和膨胀会更快扩大感受野,但同时降低时间分辨率或引入采样间隔。
感受野应覆盖任务局部结构。100 Hz采样下5点只有50 ms,无法单独描述1秒周期;后续池化与多层卷积可以扩大上下文。最终分类前常使用全局平均池化,把时间位置汇总成通道特征。
padding影响边界。valid会缩短序列,same会补零保持长度。窗口两端的补零并非真实信号,若事件常落在边界,模型可能受到影响。训练和部署必须使用模型声明的同一padding。
| 连续两层stride=1卷积的感受野: R₂ = 1 + (K₁-1) + (K₂-1) K₁=K₂=5时,R₂=9个采样点。 |
深度可分离卷积把时间过滤与通道混合拆开
普通卷积的每个输出通道同时连接所有输入通道,权重为K×Cin×Cout。深度卷积先为每个输入通道独立做时间过滤,权重K×Cin;1×1 pointwise卷积再混合通道,权重Cin×Cout。
Cin=16、Cout=32、K=5时,普通卷积权重2560;深度可分离为80+512=592,明显减少。实际速度取决于目标内核是否高效支持这些算子,较少MACC不保证同等比例加速。
激活内存仍可能很大。若深度卷积和pointwise之间保留长序列中间张量,Arena峰值不会按参数比例下降。结构选择要同时检查权重、激活与内核支持。
普通与深度可分离卷积的计算对象
| 阶段 | 权重数量 | 作用 |
|---|---|---|
| 普通Conv1D | K×Cin×Cout | 时间与通道联合提取 |
| Depthwise | K×Cin | 每通道独立时间过滤 |
| Pointwise | Cin×Cout | 通道线性组合 |
动手:让普通卷积与可分离卷积在同一输入上对账
代码构建两个输入100×6、输出类别相同的网络,打印模型摘要、参数量与实际输出shape。这里只比较结构,不声称两者准确率相同。
实验环境与输入
- 安装TensorFlow:`python -m pip install tensorflow`。
- 保存为 `conv_compare.py` 并运行。
- 无需训练数据,使用全零张量验证shape。
按顺序完成实验
- 运行并记录两个模型参数。
- 核对SeparableConv1D由depthwise与pointwise组成。
- 把通道数24改为48,比较参数增长。
- 加入stride=2并观察时间长度与后续激活下降。
可直接运行:两个1D卷积候选模型的结构比较
import tensorflow as tf |
先读懂代码中的关键路径
- 两个模型保持输入、池化与输出一致,只替换卷积类型,便于归因参数差异。
- 逐层打印output.shape和count_params,可与手算公式对账。
- 全局平均池化把时间轴压缩为通道向量,避免大Flatten。
- 全零张量只验证shape和执行,不用于评价识别效果。
你应该观察到什么
- 两个模型输出shape均为(1,5)。
- 可分离卷积模型参数显著少于普通卷积。
- 池化后时间长度从100降到50。
成功标准
- 你能手算每个卷积层参数并与摘要一致。
- 模型使用的算子在目标TFLM版本中有实现。
- 比较报告同时包含Arena和目标板延迟。
失败时从哪里查起
卷积结构部署问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 参数少但更慢 | 可分离内核效率较低 | 在目标MCU测量算子耗时 |
| 输出长度不符 | padding/stride解释错误 | 逐层打印shape |
| 短事件漏检 | 下采样过早 | 检查感受野与时间分辨率 |
结构公式用于提出候选,最终仍要在同一数据、同一量化和同一目标板条件下比较。
把实验迁移到真实MCU项目
转换后导出算子列表,确认SeparableConv1D实际分解成哪些TFLite算子,并与TFLM Resolver和CMSIS-NN支持逐项核对。
可分离卷积的参数优势需要目标板计时兑现。若内核效率低或张量搬运占主导,普通卷积可能更快。保留同输入的逐模型实测。
量化后再次查看每层shape和算子。训练图中的激活、批归一化或卷积可能在转换时融合,最终TFLite结构才是Resolver、Arena和板端计时的依据。
把结果再向前推进一步
- 计算K=5、Cin=24、Cout=32的两种卷积权重比。
- 画出你的网络每层时间长度和感受野。
- 检查每个算子是否有目标平台优化内核。
收束:1D卷积利用时间局部性和参数共享,深度可分离卷积进一步拆分时间与通道计算。权重、激活和板端内核效率仍需同时验证。
参考资料:
Arm CMSIS-NN 官方文档
TensorFlow Lite Micro 官方代码仓库
Google AI Edge:构建并转换微控制器模型