Edge TPU编译器:错误:量化的_dimension必须在范围内[0,1).是3



我正在尝试获取mobilenetv2模型(重新训练我的数据(以在Google Edge TPU Coral上运行。

我遵循了此tuturial 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/docs/edgetpu/compu/compil/compil/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 Document上。

我有相同的问题和相同的错误消息。我使用tensorflow.keras.applications mobilenetv2重新训练mobilenetv2。我发现我的模型与珊瑚的示例模型(https://coral.withgoogle.com/models/(之间的TFLITE张量有一些很大的差异。

首先,输入和输出的类型不同。当我将TF.KERAS模型转换为TFLITE时,它包含浮动类型输入和输出张量,而示例模型具有整数类型。如果我使用TensorFlow-Lite(https://www.tensorflow.org/lite/convert/(使用命令行转换和Python转换,这是不同的。命令行转换输出Integer类型IO,但是Python转换输出了Float Type IO。(这真的很奇怪。(

第二,示例模型中没有批处理标准化(BN(层,但是Keras MobilenetV2中有一些BN。我认为'错误:量化的dimension的数量必须在范围内[0,1(。是3与BN的数量有关,因为KERAS模型中有17亿层。

我仍在为这个问题而苦苦挣扎。我将遵循珊瑚的再培训示例来解决它。(https://coral.withgoogle.com/docs/edgetpu/retrain-detection/(

我也有类似的错误,使用TF-nightly build 1.15进行完整的整数量化,以及使用Edge TPU编译器的使用。我的错误通过这种方法解决了。

在Github中提出了同样的问题,您可以看到它 - 这里

此问题已固定在Tensorflow1.15-RC中。将您的模型转换为新的TF版本中的TFLITE。然后,Tflite模型将在TPU编译器中起作用。

并将这些线条作为UINT8类型的TFLITE模型的输入和输出。(我认为应该是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

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

Edge TPU Compiler version 2.0.267685300

相关内容

最新更新