【问题标题】:Edge TPU Compiler: ERROR: quantized_dimension must be in range [0, 1). Was 3Edge TPU 编译器:错误:quantized_dimension 必须在 [0, 1) 范围内。是 3
【发布时间】:2019-12-05 15:22:59
【问题描述】:

我正在尝试让 Mobilenetv2 模型(对我的数据重新训练最后一层)在 Google 边缘 TPU Coral 上运行。

我已按照此教程 https://www.tensorflow.org/lite/performance/post_training_quantization?hl=en 进行训练后量化。相关代码为:

...
train = tf.convert_to_tensor(np.array(train, dtype='float32'))
my_ds = tf.data.Dataset.from_tensor_slices(train).batch(1)


# POST TRAINING QUANTIZATION
def representative_dataset_gen():
    for input_value in my_ds.take(30):
        yield [input_value]

converter = tf.lite.TFLiteConverter.from_keras_model_file(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset_gen
converter.target_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
tflite_quant_model = converter.convert()

我已经成功生成了 tflite 量化模型,但是当我运行 edgetpu_compiler(关注此页面 https://coral.withgoogle.com/docs/edgetpu/compiler/#usage)时,我得到了以下输出:

edgetpu_compiler  Notebooks/MobileNetv2_3class_visit_split_best-val- 
acc.h5.quant.tflite

Edge TPU Compiler version 2.0.258810407
INFO: Initialized TensorFlow Lite runtime.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
Invalid model: Notebooks/MobileNetv2_3class_visit_split_best-val-        
acc.h5.quant.tflite
Model could not be parsed

模型的输入形状是 3 通道 RGB 图像。可以对 3 通道图像进行全整数量化吗?我在 TensorFlow 和 Google Coral 文档中找不到任何说明您不能这样做的内容。

【问题讨论】:

  • 我认为这不是 3 个频道的问题。我有一个使用 3 个通道的模型,它在边缘 tpu 上没有问题(当我使用设置了手动最小/最大标志的 toco 转换器转换它时)。但是,当我使用训练后量化时,我得到了同样的错误。所以似乎还有另一个问题,我也无法弄清楚。
  • 你知道 qunatized_dimension 是什么意思吗?然后我们也许可以找出错误来自哪里
  • 根据tensorflow.org/lite/performance/quantization_spec,quantization_dimension 表示为张量指定 scale 和 zero_point 参数的轴。所以很奇怪,显然只有 [0, 1) 被允许这样做,因为我认为它是 [0, maxTensorDimension] 之间的值。这看起来真的是编译器的一个奇怪错误,而不是转换后的模型本身。
  • @Marcel_marcel1991 你能解释一下如何在 toco 中找到 std_dev 和平均值吗?对于 MobileNetV2

标签: tensorflow quantization tpu google-coral


【解决方案1】:

我有同样的问题和同样的错误信息。我使用 tensorflow.keras.applications mobilenetv2 重新训练了 MobilenetV2。我发现我的模型和 Coral 的示例模型 (https://coral.withgoogle.com/models/) 之间的 TFLite 张量存在很大差异。

首先,输入和输出的类型不同。当我将 tf.keras 模型转换为 tflite 时,它​​包含浮点类型输入和输出张量,而示例模型具有整数类型。如果我使用来自 tensorflow-lite (https://www.tensorflow.org/lite/convert/) 的命令行转换和 python 转换,情况会有所不同。 命令行转换输出整数类型io,而python转换输出浮点类型io。 (这真的很奇怪。)

其次,示例模型中没有批量归一化(BN)层,但 Keras MobilenetV2 中有一些 BN。我认为 'ERROR: quantized_dimension 的数量必须在 [0, 1) 范围内。是3。与 BN 的数量有关,因为 Keras 模型中有 17 个 BN 层。

我仍在努力解决这个问题。我只是按照珊瑚的再训练例子来解决它。 (https://coral.withgoogle.com/docs/edgetpu/retrain-detection/)

【讨论】:

    【解决方案2】:

    此问题已在 tensorflow1.15-rc 中修复。在新的 tf 版本中将您的模型转换为 TFLite。然后 TFLite 模型将在 TPU 编译器中工作。

    并将这些使 TFlite 模型的输入和输出设置为 uint8 类型的行。 (我认为它应该是 tf.int8。)

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

    检查下面的链接。 https://www.tensorflow.org/lite/performance/post_training_quantization

    【讨论】:

    • 不知道为什么这被否决,但这两行至关重要:``` converter.inference_input_type = tf.uint8 converter.inference_output_type = tf.uint8 ```
    【解决方案3】:

    我有类似的错误,使用 tf-nightly build 1.15 进行后期训练全整数量化并使用该 .tflite 文件,使用边缘 TPU 编译器编译它应该可以工作。用这种方法解决了我的错误。

    同样的问题在 github 中提出,你可以看到它 - here

    【讨论】:

      【解决方案4】:

      更新到最新的编译器版本后是否还有这个问题?

      Edge TPU Compiler version 2.0.267685300
      

      【讨论】:

      • 问题是 tensorflow 版本而不是边缘 tpu 编译器。它适用于 tf-nightly build 1.15。
      猜你喜欢
      • 2020-09-13
      • 2018-02-22
      • 2018-08-31
      • 2018-02-28
      • 1970-01-01
      • 2016-12-21
      • 2020-06-24
      • 1970-01-01
      • 2019-10-04
      相关资源
      最近更新 更多