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,问题似乎已经解决。