3、TinyML中的数据表示:时间序列、多通道数据、数据维度与形状
TinyML 模型的输入输出本质上都是张量(Tensor),而多传感器融合场景下的数据表示,直接决定了模型能否正确解析物理世界的信息。与传统的单传感器单特征应用不同,TinyML 多传感器输入需要同时处理时间维度和通道维度,并确保数据在内存中的布局与模型期望的形状完全一致。本章将深入剖析时间序列数据在 TinyML 中的组织方式、多通道数据的拼接策略、数据维度与形状的转换规则,以及这些概念在嵌入式部署中的实际影响。
3.1 时间序列数据在 TinyML 中的组织方式
TinyML 模型处理的是有限长度的时间窗口(Window),而非无限流式数据。传感器以固定采样率(如 50Hz、100Hz)连续输出数据点,模型需要在一个时间窗口内捕获足够的时序特征。以 6 轴 IMU(加速度计 + 陀螺仪)为例,若采样率为 100Hz,窗口长度为 1 秒,则每个窗口包含 100 个时间步,每个时间步有 6 个特征值(ax, ay, az, gx, gy, gz)。在内存中,这组数据通常以二维数组形式存储:形状为 (100, 6) 的浮点数组,按行优先(C-order)排列,即先存储第 0 个时间步的 6 个特征,再存储第 1 个时间步的 6 个特征,依此类推。
窗口的滑动步长(Stride)决定了相邻窗口之间的重叠程度。步长小于窗口长度时,相邻窗口有重叠,这有助于平滑预测结果并减少边界效应。例如,窗口长度为 100 个采样点,步长为 20 个采样点,则相邻窗口重叠 80 个采样点,重叠率为 80%。在 TinyML 应用中,重叠率通常设置在 50%~75% 之间,以平衡计算开销与预测稳定性。窗口数据在送入模型前,还需要进行归一化处理,常见方法包括 Z-score 标准化(减去均值除以标准差)或 Min-Max 缩放(映射到 [0,1] 区间),这能加速模型收敛并提高数值稳定性。
3.2 多通道数据的拼接策略
多传感器融合的核心问题是如何将不同来源的数据组织成模型可接受的输入格式。常见的拼接策略有三种:通道维拼接(Channel-wise Concatenation)、特征维拼接(Feature-wise Concatenation)和时间维拼接(Time-wise Concatenation)。通道维拼接是最常用的方式,它将不同传感器的数据在特征维度上合并,形成 (时间步, 总特征数) 的二维矩阵。例如,将 3 轴加速度计和 3 轴陀螺仪拼接后,总特征数为 6;若再加入 3 轴磁力计,总特征数变为 9。
特征维拼接与通道维拼接在数学上等价,但强调不同传感器数据在特征空间中的并列关系。时间维拼接则较少使用,它适用于不同传感器采样率不一致的场景,例如加速度计 100Hz、麦克风 16kHz,此时需要先进行时间对齐或重采样,再在时间维度上拼接。下表对比了三种拼接策略的适用场景与优缺点:
| 拼接策略 | 输出形状 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| 通道维拼接 | (T, C1+C2+...) | IMU 多轴融合、多传感器同步采样 | 实现简单,模型结构清晰 | 要求所有传感器采样率一致 |
| 特征维拼接 | (T, F1+F2+...) | 异构特征(如统计量+原始信号) | 可混合不同抽象层次的特征 | 需要额外特征工程 |
| 时间维拼接 | (T1+T2, C) | 不同采样率的传感器融合 | 保留各自时间分辨率 | 需时间对齐,模型复杂度高 |
在实际工程中,通道维拼接是最推荐的做法,因为它直接对应硬件上的多路 ADC 同步采样。例如,STM32 系列微控制器内置多通道 ADC,可以在一个触发信号下同时采样多个传感器通道,从而保证数据的时间对齐性。拼接后的数据形状为 (窗口长度, 总通道数),例如 (100, 9) 表示 100 个时间步、9 个通道(3 轴加速度 + 3 轴陀螺仪 + 3 轴磁力计)。
3.3 数据维度与形状的转换规则
TinyML 模型对输入张量的形状有严格的要求。以 TensorFlow Lite for Microcontrollers 为例,模型输入通常需要 4 维张量:(batch_size, height, width, channels),但对于 1D 时序数据,height 和 width 被压缩为 1,实际形状为 (1, time_steps, features, 1)。在部署前,必须将原始传感器数据转换为模型期望的形状。转换过程通常包括以下步骤:
- 数据切片:从连续数据流中截取一个窗口,得到形状为 (time_steps, features) 的二维数组。
- 维度扩展:使用
expand_dims操作在开头添加 batch 维度,在末尾添加 channel 维度,得到 (1, time_steps, features, 1)。 - 数据类型转换:将浮点数据转换为模型要求的类型(如 int8 或 float32),并进行量化缩放。
- 内存对齐:确保数据缓冲区按 4 字节或 8 字节对齐,以满足 CMSIS-NN 等优化库的要求。
形状转换错误是 TinyML 部署中最常见的错误之一。例如,将 (100, 9) 的数据直接送入期望 (1, 100, 9, 1) 的模型,会导致维度不匹配错误。在嵌入式环境中,这种错误通常表现为推理结果全零或程序崩溃,而非像 PC 端那样抛出清晰的异常信息。因此,在编写推理代码时,建议使用静态断言或运行时检查来验证输入张量的形状。
实战案例:基于 9 轴 IMU 的人体活动识别
某可穿戴设备项目需要识别行走、跑步、上楼、下楼四种活动,使用 9 轴 IMU(加速度计 3 轴 + 陀螺仪 3 轴 + 磁力计 3 轴),采样率 50Hz,窗口长度 2 秒(100 个采样点),步长 1 秒(50 个采样点)。初始方案将 9 个通道的数据直接拼接为 (100, 9) 的输入,送入 1D-CNN 模型,但验证准确率仅为 78%。分析发现,磁力计数据受环境磁场干扰严重,且其量纲与加速度计、陀螺仪差异较大(磁力计单位为 μT,加速度计为 m/s²),导致模型训练不稳定。
改进方案:首先对每个通道独立进行 Z-score 标准化,消除量纲差异;然后将加速度计和陀螺仪拼接为 (100, 6),磁力计单独作为辅助输入,通过一个并行的 1D-CNN 分支提取特征,最后将两个分支的特征在密集层拼接。调整后,模型输入形状变为两个张量:主输入 (1, 100, 6, 1) 和辅助输入 (1, 100, 3, 1)。经过 50 轮训练,验证准确率提升至 91%。部署时,将两个输入张量分别分配独立的内存缓冲区,并确保它们按 16 字节对齐以满足 SIMD 指令要求。
该案例表明,多通道数据的拼接不仅是形状上的合并,更需要考虑各通道的物理意义、量纲和噪声特性。盲目拼接所有通道可能导致模型性能下降,而合理的通道分组和特征融合策略能显著提升识别效果。
3.4 常见误区与工程复盘
在 TinyML 多传感器数据表示中,开发者常陷入以下误区:
- 忽视数据对齐:不同传感器使用独立的中断或 DMA 通道读取,导致采样时刻不一致。例如,加速度计在 t=0ms 采样,陀螺仪在 t=2ms 采样,虽然采样率相同,但数据在时间上存在偏移。解决方法是使用硬件同步信号(如 IMU 的 SYNC 引脚)或软件插值对齐。
- 形状硬编码:在代码中直接写死输入形状,如
input_shape = (100, 9),当传感器配置变化时(如增加一个环境光传感器),需要修改多处代码。建议使用宏定义或配置文件管理形状参数。 - 忽略内存对齐:CMSIS-NN 和 ARM 的 DSP 库要求数据按 4 字节对齐,否则会触发硬件 fault 或性能骤降。在分配传感器数据缓冲区时,应使用
alignas(16)或等效的对齐属性。 - 混淆通道顺序:不同传感器驱动返回的数据顺序可能不同(如先返回陀螺仪再返回加速度计),而模型训练时的数据顺序是固定的。必须在预处理阶段统一通道顺序,否则推理结果完全错误。
总结复盘时,建议建立一张数据形状检查表,包含以下项目:输入张量的维度数、每个维度的大小、数据类型、内存对齐方式、通道顺序、归一化参数(均值和标准差)。在每次模型更新或传感器配置变更后,对照检查表逐项验证,可有效避免部署阶段的低级错误。
风险提示:在资源受限的 MCU 上,数据形状的灵活性受到严格限制。动态形状(如可变窗口长度)在 TensorFlow Lite for Microcontrollers 中不受支持,所有输入维度必须在编译时固定。设计模型时,应优先选择固定窗口长度和固定通道数,以简化部署逻辑并减少内存碎片。
综上所述,TinyML 中的数据表示不仅仅是简单的数组操作,它涉及传感器物理特性、内存布局、模型架构和硬件约束的多重耦合。正确理解时间序列的窗口化、多通道的拼接策略以及形状转换的底层规则,是构建稳定、高效的多传感器 TinyML 应用的基础。在实际开发中,建议先用 PC 端 Python 脚本验证数据形状和预处理流程,再移植到嵌入式平台,这样能大幅缩短调试周期。