【发布时间】:2019-07-24 16:51:10
【问题描述】:
我已经成功地转换了一个量化的 8 位 tflite 模型来进行物体检测。我的模型最初是在通过除以 255 归一化的图像上训练的,因此原始输入范围是 [0, 1]。由于我的量化 tflite 模型需要输入为 uint8,如何将我的图像(最初为 [0, 255])转换为适合我的网络? 另外,如何将输出转换为浮点数以将结果与浮点模型进行比较?
以下代码没有给我正确的结果。
'''python
im = cv2.imread(image_path)
im = im.astype(np.float32, copy=False)
input_image = im
input_image = np.array(input_image, dtype=np.uint8)
input_image = np.expand_dims(input_image, axis=0)
interpreter.set_tensor(input_details[0]['index'], input_image)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
output_data2 = interpreter.get_tensor(output_details[1]['index'])
output_data3 = interpreter.get_tensor(output_details[2]['index'])
min_1 = -8.198164939880371
max_1 = 8.798029899597168
scale = (max_1 - min_1)/ 255.0
min_2 = -9.77856159210205
max_2 = 10.169703483581543
scale_2 = (max_2 - min_2) / 255.0
min_3 = -14.382895469665527
max_3 = 11.445544242858887
scale_3 = (max_3 - min_3) / 255.0
output_data = (output_data ) * scale + min_1
output_data2 = (output_data2) * scale_2 + min_2
output_data3 = (output_data3) * scale_3 + min_3
'''
【问题讨论】:
-
对于输入,应该是
input_image = im / 256但是对于输出,你从哪里获取这些最小值/最大值? -
它来自 tf.lite.create_train_graph() 添加的 fakequantization 节点,它跟踪每个层的最小最大激活以进行量化
-
在某些情况下您碰巧获得的输出值可能无法正确缩放输出到 unit8。
-
我不确定我是否理解正确。但是 tflite 量化会跟踪最小值和最大值,并在该范围内执行统一量化,因此浮动输出应该在 uint8 中正确表示。我用假量化节点测试浮点模型,输出是正确的。
-
也许如果你提供正确缩放的输入,输出会变得更好
标签: tensorflow tensorflow-lite quantization