Преобразование модели keras в квантованную tflite потерянную точность

Я пытаюсь преобразовать свою модель keras в квантованную модель tflite, чтобы я мог запустить свою модель на коралловом TPU, но результат моей модели keras и модели tflite значительно отличается.

Красные точки - это квантованные выходные данные модели tflite, а синие точки - исходные выходные данные модели keras.

введите здесь описание изображения

Вот мой код для преобразования модели keras в квантованную модель tflite:

quant = True
gc.collect()
import tensorflow as tf
import numpy as np
import pathlib
print(tf.__version__)
converter = tf.lite.TFLiteConverter.from_keras_model(model)
if quant:
    print("Converting quant....")
    sample_size = 200
    rdm_idx = np.random.choice(range(len(X_test)),sample_size)
    rep_data = tf.cast(X_train[rdm_idx], tf.float32) / 255.0
    dataset = tf.data.Dataset.from_tensor_slices(rep_data).batch(1)

    def representative_data_gen():
        for input_value in dataset.take(sample_size):
            yield [input_value]

    converter.optimizations = [tf.lite.Optimize.OPTIMIZE_FOR_SIZE]
    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
    tflite_model_quant = converter.convert()
    open("MaskedLandMarkDetction_MobileNetV2_quant_fromKeras_v5.tflite", "wb").write(tflite_model_quant)

    print("Write quantization tflite done.")
else:
    print("Converting normal....")
    tflite_model = converter.convert()
    open("MaskedLandMarkDetction_MobileNetV2_fromKeras.tflite", "wb").write(tflite_model)
    print("Write tflite done.") 

X_train - это мои данные для обучения, и я буду масштабировать значение входных изображений от 0 до 1 путем деления 255., поэтому я делаю то же самое в representative_data_gen функциях.

Мы будем очень благодарны за любую помощь, которую вы можете оказать.

Я использовал версию tensorflow gpu 2.2.0.


person Jim Chen    schedule 28.05.2020    source источник


Ответы (1)


Похоже, использование api правильное. Не все модели гарантированно получат хорошую точность при посттренировочном квантовании. Например, задачи, требующие большей точности, или небольшие модели могут нести больше потерь.

Для этих более сложных задач мы рекомендуем использовать обучение с учетом квантования, которое доступно для моделей keras: https://www.tensorflow.org/model_optimization/guide/quantization/training.

person suharshs    schedule 29.05.2020
comment
Я пробовал, но это из-за ошибки мне: ValueError: Поддерживаются только некоторые активации Keras под tf.keras.activations. Для других активаций используйте Quantizer напрямую и обновите конфигурацию слоя с помощью QuantizeConfig. - person Jim Chen; 31.05.2020
comment
Модель, которую я использую, меньше встроенной модели MobileNetV2 до версии 2.2.0. - person Jim Chen; 31.05.2020