TensorFlow Lite 和 TensorFlow 运算符兼容性

您在模型中使用的机器学习 (ML) 运算符会影响将 TensorFlow 模型转换为 TensorFlow Lite 格式的过程。TensorFlow Lite 转换器支持有限数量的 TensorFlow 运算符,这些运算符用于常见的推理模型,这意味着并非所有模型都可直接转换。转换器工具允许您包含其他运算符,但以这种方式转换模型还需要您修改用于执行模型的 TensorFlow Lite 运行时环境,这可能会限制您使用标准运行时部署选项的能力,例如 Google Play 服务.

TensorFlow Lite 转换器旨在分析模型结构并应用优化,以使其与直接支持的运算符兼容。例如,根据模型中的 ML 运算符,转换器可能会 省略或融合 这些运算符,以将其映射到其 TensorFlow Lite 对应项。

即使对于支持的运算符,出于性能原因,有时也需要特定的使用模式。了解如何构建可与 TensorFlow Lite 一起使用的 TensorFlow 模型的最佳方法是仔细考虑运算符的转换和优化方式,以及此过程施加的限制。

支持的运算符

TensorFlow Lite 内置运算符是 TensorFlow 核心库中运算符的子集。您的 TensorFlow 模型还可能包含自定义运算符,这些运算符以复合运算符或您定义的新运算符的形式存在。下图显示了这些运算符之间的关系。

TensorFlow operators

从这些 ML 模型运算符中,转换过程支持 3 种类型的模型

  1. 仅包含 TensorFlow Lite 内置操作符的模型。(**推荐**)
  2. 包含内置操作符和部分 TensorFlow 核心操作符的模型。
  3. 包含内置操作符、TensorFlow 核心操作符和/或自定义操作符的模型。

如果您的模型只包含 TensorFlow Lite 原生支持的操作,则不需要任何额外的标志来转换它。这是推荐的做法,因为这种类型的模型可以顺利转换,并且使用默认的 TensorFlow Lite 运行时更容易优化和运行。您还可以为您的模型提供更多部署选项,例如 Google Play 服务。您可以从 TensorFlow Lite 转换器指南 开始。请参阅 TensorFlow Lite 操作符页面,了解内置操作符的列表。

如果您需要包含来自核心库的选定 TensorFlow 操作,则必须在转换时指定它,并确保您的运行时包含这些操作。有关详细步骤,请参阅 选择 TensorFlow 操作符 主题。

尽可能避免在转换后的模型中包含自定义操作符的最后一种选择。 自定义操作符 是通过组合多个原始 TensorFlow 核心操作符或定义一个全新的操作符创建的操作符。当转换自定义操作符时,它们可能会增加整个模型的大小,因为它们会产生对内置 TensorFlow Lite 库之外的依赖项。如果自定义操作符不是专门为移动或设备部署创建的,与服务器环境相比,它们部署到资源受限设备时可能会导致性能下降。最后,与包含选定的 TensorFlow 核心操作符一样,自定义操作符要求您 修改模型运行时环境,这会限制您利用标准运行时服务,例如 Google Play 服务

支持的类型

大多数 TensorFlow Lite 操作针对浮点 (float32) 和量化 (uint8, int8) 推理,但许多操作尚未针对其他类型,例如 tf.float16 和字符串。

除了使用不同版本的运算之外,浮点模型和量化模型之间的另一个区别是它们的转换方式。量化转换需要张量的动态范围信息。这需要在模型训练期间进行“伪量化”,通过校准数据集获取范围信息,或进行“动态”范围估计。有关更多详细信息,请参阅 量化

直接转换、常量折叠和融合

即使 TensorFlow Lite 没有直接的等效项,许多 TensorFlow 操作也可以由 TensorFlow Lite 处理。对于可以从图中简单删除的操作 (tf.identity),用张量替换 (tf.placeholder) 或融合成更复杂的操作 (tf.nn.bias_add),情况就是如此。即使某些支持的操作有时也可能通过这些过程之一被删除。

以下是非详尽的 TensorFlow 操作列表,这些操作通常从图中删除

实验性操作

以下 TensorFlow Lite 操作存在,但尚未准备好用于自定义模型

  • CALL
  • CONCAT_EMBEDDINGS
  • CUSTOM
  • EMBEDDING_LOOKUP_SPARSE
  • HASHTABLE_LOOKUP
  • LSH_PROJECTION
  • SKIP_GRAM
  • SVDF