tensorflow-lite tf.lite.Interpreter set_tensor 无法正确识别 uint8 输入张量
tensorflow-lite tf.lite.Interpreter set_tensor failing to properly recognize uint8 input tensors
我有一个有效的 .tflite
模型(采用 180x180 浮点灰度图像)作为输入,returns 6 个浮点 sigmoid 输出。一切都按预期工作,并通过测试图像产生了预期的结果。
我正在尝试将 .tflite
模型量化为 uint8
。请注意,我将输入和输出类型设置为 unit8
(为简洁起见进行了编辑):
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset_gen
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
当我尝试使用以下代码(简洁)对其进行 运行 推断时:
print ("IMAGE_ARRAY type",img_array.dtype)
interpreter = tf.lite.Interpreter(model_path="bkgmodel_quant.tflite")
interpreter.resize_tensor_input(0, [1, 180, 180, 1])
interpreter.allocate_tensors()
print ("INPUT TENSOR",interpreter.get_input_details())
input = interpreter.tensor(interpreter.get_input_details()[0]["index"])
output = interpreter.tensor(interpreter.get_output_details()[0]["index"])
interpreter.set_tensor(0, img_array)
当我 运行 我得到以下错误:
ValueError: Cannot set tensor: Got value of type UINT8 but expected type INT8 for input 0, name: input_2_int8
当我查看图像数据和输入张量的类型时,它们发现 是 uint8
:
IMAGE_ARRAY type uint8
INPUT TENSOR [{'name': 'input_2', 'index': 22, 'shape': array([ 1, 180, 180, 1], dtype=int32), 'shape_signature': array([ -1, 180, 180, 1], dtype=int32), 'dtype': <class 'numpy.uint8'>, 'quantization': (1.0, 0), 'quantization_parameters': {'scales': array([1.], dtype=float32), 'zero_points': array([0], dtype=int32), 'quantized_dimension': 0}, 'sparsity_parameters': {}}]
(我假设只查看输入张量中的 dtype
)。
所以 - 实际上,输入张量 应该 是一个 uint8,而图像 是 一个 uint8 - 但我得到了这个错误。
作为实验 - 我尝试更改 仅 我的推理代码以将图像数据设置为 int8
。当我这样做时,错误消失并且推理 运行s,但是我的模型预测都是错误的。
(值得注意的是,所有输出值加起来几乎是 256。我假设这意味着模型工作正常并产生有效数据 - 我也是假设 8 位 sigmoids 应该有一点舍入误差,它们加起来不正好是 256??)
如果我做错了什么,或者这是 Tensorflow-lite 中的错误??
我从 Tensorflow 2.3 升级到 2.5,问题似乎已经解决。
我有一个有效的 .tflite
模型(采用 180x180 浮点灰度图像)作为输入,returns 6 个浮点 sigmoid 输出。一切都按预期工作,并通过测试图像产生了预期的结果。
我正在尝试将 .tflite
模型量化为 uint8
。请注意,我将输入和输出类型设置为 unit8
(为简洁起见进行了编辑):
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset_gen
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
当我尝试使用以下代码(简洁)对其进行 运行 推断时:
print ("IMAGE_ARRAY type",img_array.dtype)
interpreter = tf.lite.Interpreter(model_path="bkgmodel_quant.tflite")
interpreter.resize_tensor_input(0, [1, 180, 180, 1])
interpreter.allocate_tensors()
print ("INPUT TENSOR",interpreter.get_input_details())
input = interpreter.tensor(interpreter.get_input_details()[0]["index"])
output = interpreter.tensor(interpreter.get_output_details()[0]["index"])
interpreter.set_tensor(0, img_array)
当我 运行 我得到以下错误:
ValueError: Cannot set tensor: Got value of type UINT8 but expected type INT8 for input 0, name: input_2_int8
当我查看图像数据和输入张量的类型时,它们发现 是 uint8
:
IMAGE_ARRAY type uint8
INPUT TENSOR [{'name': 'input_2', 'index': 22, 'shape': array([ 1, 180, 180, 1], dtype=int32), 'shape_signature': array([ -1, 180, 180, 1], dtype=int32), 'dtype': <class 'numpy.uint8'>, 'quantization': (1.0, 0), 'quantization_parameters': {'scales': array([1.], dtype=float32), 'zero_points': array([0], dtype=int32), 'quantized_dimension': 0}, 'sparsity_parameters': {}}]
(我假设只查看输入张量中的 dtype
)。
所以 - 实际上,输入张量 应该 是一个 uint8,而图像 是 一个 uint8 - 但我得到了这个错误。
作为实验 - 我尝试更改 仅 我的推理代码以将图像数据设置为 int8
。当我这样做时,错误消失并且推理 运行s,但是我的模型预测都是错误的。
(值得注意的是,所有输出值加起来几乎是 256。我假设这意味着模型工作正常并产生有效数据 - 我也是假设 8 位 sigmoids 应该有一点舍入误差,它们加起来不正好是 256??)
如果我做错了什么,或者这是 Tensorflow-lite 中的错误??
我从 Tensorflow 2.3 升级到 2.5,问题似乎已经解决。