边缘TPU编译器:错误:量化维度必须在范围[0, 1]内。为3。

9

我正在尝试让一个重新训练了最后几层的Mobilenetv2模型在Google Edge 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文档中都没有找到任何说明不能这样做的内容。


1
我认为这不是与三个通道有关的问题。我有一个使用三个通道的模型,在使用toco转换器进行手动min / max标志设置后,它可以在边缘tpu上无问题运行。但是,当我使用训练后量化时,我会遇到相同的错误。因此,似乎还有其他问题,我也尚未解决。 - Marcel_marcel1991
你知道“量化维度”是什么意思吗?如果知道的话,我们或许可以找出错误出在哪里。 - Marcel_marcel1991
3
根据https://www.tensorflow.org/lite/performance/quantization_spec,量化维度(quantization_dimension)指定了张量的比例(scale)和零点(zero_point)参数所在的轴。因此,奇怪的是,似乎只允许使用[0,1)范围内的值,因为我会认为它应该是一个介于[0,maxTensorDimension]之间的值。这似乎确实是编译器本身的奇怪错误,而不是转换模型本身的错误。 - Marcel_marcel1991
@Marcel_marcel1991,你能否解释一下如何找到在toco中使用的MobileNetV2的std_dev和mean值? - Paulo Ribeiro
4个回答

2
我有同样的问题和错误信息。我使用tensorflow.keras.applications mobilenetv2重新训练了MobilenetV2。我发现我的模型和Coral的示例模型(https://coral.withgoogle.com/models/)之间的TFLite张量存在一些重大差异。
首先,输入和输出的类型不同。当我将我的tf.keras模型转换为tflite时,它包含浮点类型的输入和输出张量,而示例模型具有整数类型。如果我使用命令行转换和来自tensorflow-lite的python转换,则会有所不同(https://www.tensorflow.org/lite/convert/)。命令行转换输出整数类型io,但python转换输出浮点类型io。(这真的很奇怪。)
其次,示例模型中没有Batch normalization(BN)层,但是Keras MobilenetV2中有一些BNs。我认为“ERROR: quantized_dimension must be in range [0, 1). Was 3.”的数量与BN的数量有关,因为Keras模型中有17个BN层。
我仍在努力解决这个问题。我打算遵循Coral的重新训练示例来解决它。(https://coral.withgoogle.com/docs/edgetpu/retrain-detection/)

1
我曾遇到类似错误。在使用tf-nightly版本1.15进行完整的整数量化后,使用生成的.tflite文件,并使用Edge TPU编译器进行编译,这应该可以解决我的错误。我的问题通过这种方法得到了解决。
同样的问题在GitHub上也被提出,你可以在这里看到。

1
这个问题已经在tensorflow1.15-rc中得到解决。请将您的模型转换为新版本中的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 - Nam Vu

0

在更新到最新的编译器版本后,您是否仍然遇到此问题?

Edge TPU Compiler version 2.0.267685300

1
问题出在 TensorFlow 版本上,而不是 Edge TPU 编译器。它可以在 tf-nightly 构建的 1.15 上运行。 - Paulo Ribeiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接