微控制器具有有限的 RAM 和存储空间,这限制了机器学习模型的大小。此外,适用于微控制器的 TensorFlow Lite 目前支持的操作子集有限,因此并非所有模型架构都是可能的。
本文档介绍了将 TensorFlow 模型转换为在微控制器上运行的过程。它还概述了支持的操作,并提供了一些有关设计和训练模型以适应有限内存的指导。
有关构建和转换模型的端到端可运行示例,请参阅 Hello World 示例。
模型转换
要将经过训练的 TensorFlow 模型转换为在微控制器上运行,您应该使用 TensorFlow Lite 转换器 Python API。这将把模型转换为 FlatBuffer
,减小模型大小,并修改它以使用 TensorFlow Lite 操作。
为了获得尽可能小的模型大小,您应该考虑使用 训练后量化。
转换为 C 数组
许多微控制器平台不支持本机文件系统。从程序中使用模型的最简单方法是将其作为 C 数组包含并将其编译到程序中。
以下 unix 命令将生成一个 C 源文件,其中包含 TensorFlow Lite 模型作为 char
数组
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 for Microcontrollers 目前支持 TensorFlow 操作的有限子集,这会影响可以运行的模型架构。我们正在努力扩展操作支持,包括参考实现和针对特定架构的优化。
支持的操作可以在文件 micro_mutable_ops_resolver.h
中查看。