TF Lite用于量化意识训练的Toco转换器args的描述

时间:2019-07-17 14:13:18

标签: python python-3.x tensorflow tensorflow-lite

这些天来,我试图追踪有关部署带有TPU支持的TF模型的错误。

我可以在不运行TPU支持的情况下获得模型,但是一旦启用量化功能,我就会迷路。

我处于以下情况:

  1. 创建模型并对其进行培训
  2. 创建模型的评估图
  3. 冻结模型并将结果保存为协议缓冲区
  4. 在没有TPU支持的情况下成功地进行了转换和部署

对于最后一点,我使用了TFLiteConverter的Python API。生成功能性tflite模型的脚本是

import tensorflow as tf

graph_def_file = 'frozen_model.pb'
inputs = ['dense_input']
outputs = ['dense/BiasAdd']

converter = tf.lite.TFLiteConverter.from_frozen_graph(graph_def_file, inputs, outputs)
converter.inference_type = tf.lite.constants.FLOAT
input_arrays = converter.get_input_arrays()

converter.optimizations = [tf.lite.Optimize.OPTIMIZE_FOR_SIZE]

tflite_model = converter.convert()

open('model.tflite', 'wb').write(tflite_model)

这告诉我到目前为止我的方法似乎还可以。现在,如果我想使用Coral TPU棒,就必须对我的模型进行量化(在训练过程中考虑了这一点)。我要做的就是修改转换器脚本。我认为我必须将其更改为

import tensorflow as tf

graph_def_file = 'frozen_model.pb'
inputs = ['dense_input']
outputs = ['dense/BiasAdd']

converter = tf.lite.TFLiteConverter.from_frozen_graph(graph_def_file, inputs, outputs)
converter.inference_type = tf.lite.constants.QUANTIZED_UINT8      ## Indicates TPU compatibility
input_arrays = converter.get_input_arrays()

converter.quantized_input_stats = {input_arrays[0]: (0., 1.)}     ## mean, std_dev
converter.default_ranges_stats = (-128, 127)                      ## min, max values for quantization (?)
converter.allow_custom_ops = True                                 ## not sure if this is needed

## REMOVED THE OPTIMIZATIONS ALTOGETHER TO MAKE IT WORK

tflite_model = converter.convert()

open('model.tflite', 'wb').write(tflite_model)

此tflite模型在加载解释器的Python API时会产生结果,但是我无法理解它们的含义。此外,也没有(或者如果有的话,它隐藏得很好)有关如何选择均值,std_dev和最小/最大范围的文档。另外,在用edgetpu_compiler编译并部署(使用C ++ API加载)之后,我收到错误消息:

INFO: Initialized TensorFlow Lite runtime.
ERROR: Failed to prepare for TPU. generic::failed_precondition: Custom op already assigned to a different TPU.
ERROR: Node number 0 (edgetpu-custom-op) failed to prepare.

Segmentation fault

我想我在转换过程中错过了一个标志或其他东西。但是由于这里也缺少文档,所以我不确定。

简而言之:

  1. 这些参数是什么意思,std_dev,min / max以及它们如何相互作用?
  2. 转换期间我在做什么错了?

感谢您的帮助或指导!

编辑:我用完整的测试代码打开了github issue。随便玩吧。

1 个答案:

答案 0 :(得分:1)

您永远不需要手动设置量化统计。

您是否尝试过训练后量化教程?

https://www.tensorflow.org/lite/performance/post_training_integer_quant

基本上,他们设置了量化选项:

converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8

然后,他们将“代表性数据集”传递给转换器,以便转换器可以批量运行模型以收集必要的统计信息:

def representative_data_gen():
  for input_value in mnist_ds.take(100):
    yield [input_value]

converter.representative_dataset = representative_data_gen

虽然有量化训练的选项,但进行训练后量化总是比较容易。