我正在使用 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.
representative_dataset()
实际上应该有带预处理器的图像(如果有像本例这样的图像)。 DenseNet121 的正确函数应定义为:
def representative_data_gen():
for images, _ in train_ds.take(100):
tf.keras.applications.densenet.preprocess_input(yield[images])