TensorFlow Lite 和 TensorFlow 运算符兼容性

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

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

出于性能方面的考虑,即使对于支持的操作,有时也会出现特定的使用模式。要了解如何构建可与 TensorFlow Lite 搭配使用的 TensorFlow 模型,最好的方法是仔细考虑如何转换和优化操作,以及此过程施加的限制。

支持的运算符

TensorFlow Lite 内置运算符是 TensorFlow 核心库的一部分运算符。您的 TensorFlow 模型还可以包含采用复合运算符或您定义的新运算符形式的自定义运算符。下图显示了这些运算符之间的关系。

TensorFlow 运算符

在这一范围的机器学习模型运算符中,转换过程支持 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) 和量化(uint8int8)推理为目标,但许多操作尚未针对其他类型的(如 tf.float16 和字符串)使用。

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

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

TensorFlow Lite 可以处理许多 TensorFlow 操作,即使它们没有直接等效项。可直接从图中移除 (tf.identity)、替换为张量 (tf.placeholder) 或融合成更复杂的操作 (tf.nn.bias_add) 的操作就属于这种情况。有时,某些受支持的操作可能会通过上述某个流程移除。

下面列出了通常会从图中移除的 TensorFlow 操作(并非详尽无遗):

  • tf.add
  • tf.debugging.check_numerics
  • tf.constant
  • tf.div
  • tf.divide
  • tf.fake_quant_with_min_max_args
  • tf.fake_quant_with_min_max_vars
  • tf.identity
  • tf.maximum
  • tf.minimum
  • tf.multiply
  • tf.no_op
  • tf.placeholder
  • tf.placeholder_with_default
  • tf.realdiv
  • tf.reduce_max
  • tf.reduce_min
  • tf.reduce_sum
  • tf.rsqrt
  • tf.shape
  • tf.sqrt
  • tf.square
  • tf.subtract
  • tf.tile
  • tf.nn.batch_norm_with_global_normalization
  • tf.nn.bias_add
  • tf.nn.fused_batch_norm
  • tf.nn.relu
  • tf.nn.relu6

实验操作

存在以下 TensorFlow Lite 操作,但自定义模型尚未准备就绪:

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