如何预处理图像以进行INT8训练后量化?

问题描述 投票:0回答:1

我正在使用 Keras 上的 DenseNet121 来解决二元分类问题。原始模型的准确度约为 93%,而当 float16 量化 (PTQ) 时,准确度会下降到约 90%,这是可以接受的。当我意识到 DenseNet 的预处理模块将输入图像缩放到 0 到 1 之间并且每个通道都相对于 ImageNet 数据集进行归一化时(如此处所示),我正在尝试 INT8 量化。预处理我的输入图像至关重要,但 INT8 输入会导致所有像素值变为 0。

这是我的转换器:

converter = tf.lite.TFLiteConverter.from_keras_model(trained_densenet_model) converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.representative_dataset = representative_data_gen converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] converter.inference_input_type = tf.uint8 converter.inference_output_type = tf.uint8 model_lite = converter.convert()
这就是我如何定义 

representative_data_gen

:

def representative_data_gen(): for images, _ in train_ds.take(100): yield[images]
我尝试将输入和输出张量显式定义为 FLOAT16,但这仍然会导致预测 

0.


    

keras tf.keras image-classification mobilenet densenet
1个回答
0
投票

representative_dataset()

 实际上应该有带预处理器的图像(如果有像本例这样的图像)。 DenseNet121 的正确函数应定义为:

def representative_data_gen(): for images, _ in train_ds.take(100): tf.keras.applications.densenet.preprocess_input(yield[images])
    
© www.soinside.com 2019 - 2024. All rights reserved.