Квантование ввода-вывода TFLite в нескольких сигнатурах

#tensorflow #tensorflow-lite #quantization

Вопрос:

Преобразование модели TFLite позволяет автоматически квантовать или деквантировать входы или выходы модели. Вы можете сделать это, установив inference_input_type и inference_output_type соответствующим образом, как это.

 converter = tf.lite.TFLiteConverter.from_keras_model(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
 

Однако, согласно TensorFlow 2.7, модели TFLite, наконец, поддерживают несколько подписей. Они могут быть автоматически извлечены из сохраненных моделей, моделей Keras или из конкретных функций. Однако в связи с этим возникает вопрос: как вы можете установить квантование/деквантизацию для входов и выходов на уровне подписи? Более того, как вы это делаете, если подпись имеет несколько входов или выходов?

Похоже inference_input_type , и inference_output_type они довольно ограничены каким-либо одним входом (может быть, также одним выходом?) функция модель экспортируется с помощью метода вызова. Любые советы о том, как обрабатывать квантование/деквантиз для конкретных аргументов в разных сигнатурах, даже если они выполняются вручную, были бы весьма кстати.

Комментарии:

1. Небольшое обновление. Я обнаружил, что в случае нескольких подписей подпись, на которую нацелена representative_dataset (и я бы предположил, что также inference_input_type и inference_output_type ), является первой в алфавитном порядке , даже если вы конвертируете из списка конкретных функций. Это зависит от названий ваших функций. Разработчики TF: это действительно нуждается в улучшении дизайна.

Ответ №1:

Конвертер TensorFlow Lite также может квантовать несколько моделей с поддержкой сигнатур. Переопределение ввода/вывода также работает для них.

 def representative_dataset():
  # Feed data set for the "encode" signature.
  for data in encode_signature_dataset:
    yield (
      "encode", {
        "image": data.image,
        "bias": data.bias,
      }
    )

  # Feed data set for the "decode" signature.
  for data in decode_signature_dataset:
    yield (
      "decode", {
        "image": data.image,
        "hint": data.hint,
      },
    )
 

Смотрите подробности по адресу https://www.tensorflow.org/lite/performance/post_training_quantization#full_integer_quantization

Комментарии:

1. Значит, либо все аргументы квантованы, либо их нет? Вопросы о квантовании только одной сигнатуры и о том, как определяется, какую из них квантовать (по-видимому, по алфавитному порядку имен), все еще остаются.