构建和转换模型

微控制器的 RAM 和存储空间有限,这限制了机器学习模型的大小。此外,适用于微控制器的 TensorFlow Lite 目前仅支持有限的部分操作,因此并非所有模型架构都可行。

本文档介绍了将 TensorFlow 模型转换为在微控制器上运行的过程。此外,本文档还概述了支持的操作,并就设计和训练模型以适应有限内存提供了一些指导。

如需查看构建和转换模型的端到端可运行示例,请参阅 Hello World 示例。

模型转换

如需将经过训练的 TensorFlow 模型转换为在微控制器上运行,您应使用 TensorFlow Lite 转换器 Python API。这会将模型转换为 FlatBuffer,从而缩减模型大小,并将其修改为使用 TensorFlow Lite 操作。

为了获得尽可能小的模型大小,您应考虑使用训练后量化

转换为 C 数组

许多微控制器平台都没有原生文件系统支持。若要使用程序中的模型,最简单的方法就是将其添加为 C 数组并将其编译到程序中。

以下 unix 命令将生成一个 C 源文件,该文件以 char 数组形式包含 TensorFlow Lite 模型:

xxd -i converted_model.tflite > model_data.cc

输出将如下所示:

unsigned char converted_model_tflite[] = {
  0x18, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x0e, 0x00,
  // <Lines omitted>
};
unsigned int converted_model_tflite_len = 18200;

生成文件后,即可将其添加到程序中。为了提高嵌入式平台上的内存效率,请务必将数组声明更改为 const

如需查看如何在程序中添加和使用模型的示例,请参阅 Hello World 示例中的 hello_world_test.cc

模型架构和训练

在设计用于微控制器的模型时,请务必考虑模型大小、工作负载和使用的操作。

模型大小

模型必须足够小,以便(以二进制文件形式和运行时形式)能够容纳在目标设备的内存中以及程序的其余部分。

要创建较小的模型,您可以在架构中使用更少的层。但是,小型模型更容易出现欠拟合。这意味着对于许多问题,尝试使用最大内存能够容纳的模型是合理的。但是,使用较大的模型也会导致处理器工作负载增加。

工作负载

模型的大小和复杂性会影响工作负载。大型、复杂的模型可能会导致占空比增加,这意味着设备的处理器会延长工作时间,减少空闲时间。这会增加功耗和热输出,这可能是一个问题,具体取决于您的应用。

运营支持

适用于微控制器的 TensorFlow Lite 目前支持的 TensorFlow 操作有限,这会影响可以运行的模型架构。我们致力于在参考实现和优化特定架构方面扩展操作支持。

受支持的操作可在文件 micro_mutable_ops_resolver.h 中查看