Edge TPU 编译器:错误:quantized_dimension 必须在 [0, 1) 范围内。是 3
Posted
技术标签:
【中文标题】Edge TPU 编译器:错误:quantized_dimension 必须在 [0, 1) 范围内。是 3【英文标题】:Edge TPU Compiler: ERROR: quantized_dimension must be in range [0, 1). Was 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 【参考方案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。以上是关于Edge TPU 编译器:错误:quantized_dimension 必须在 [0, 1) 范围内。是 3的主要内容,如果未能解决你的问题,请参考以下文章
在 EDge TPU USB 上运行分类推理,无需每次都重新加载模型
Tensorflow 构建量化工具 - bazel 构建错误