Квантование еще не поддерживается для op: ‘DEQUANTIZE’ для tensorflow 2.x

#tensorflow2.0 #tensorflow-lite #quantization #quantization-aware-training

#tensorflow2.0 #tensorflow-lite #квантование #обучение с учетом квантования

Вопрос:

Я провожу QAT с помощью keras для модели resnet, и у меня возникла эта проблема при преобразовании в полную целочисленную модель tflite. Я попробовал новейшую версию tf-nightly, но это не решает проблему. Я использую аннотированную модель квантования для квантования пакетной нормализации во время QAT

Модель аннотирования

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

 converter = tf.lite.TFLiteConverter.from_keras_model(layer)
def representative_dataset_gen():
    for _ in range(50):
        batch = next(train_generator)
        img = np.expand_dims(batch[0][0],0).astype(np.float32)
        yield [img]
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset_gen
converter.target_spec.supported_ops = [
  tf.lite.OpsSet.TFLITE_BUILTINS_INT8
]
converter.experimental_new_converter = True

# converter.target_spec.supported_types = [tf.int8]
converter.inference_input_type = tf.int8  # or tf.uint8
converter.inference_output_type = tf.int8  # or tf.uint8
quantized_tflite_model = converter.convert()
with open("test_try_v2.tflite", 'wb') as f:
    f.write(quantized_tflite_model)
  

если я обойду эту ошибку, добавив tf.lite.OpsSet.TFLITE_BUILTINS в «target_spec.supported_ops», у меня все равно возникнет эта проблема с ДЕКВАНТИРОВАНИЕМ в компиляторе edge_tpu

 ERROR: :61 op_context.input->type == kTfLiteUInt8 || op_context.input->type == kTfLiteInt8 || op_context.input->type == kTfLiteInt16 || op_context.input->type == kTfLiteFloat16 was not true.
ERROR: Node number 3 (DEQUANTIZE) failed to prepare.

ERROR: :61 op_context.input->type == kTfLiteUInt8 || op_context.input->type == kTfLiteInt8 || op_context.input->type == kTfLiteInt16 || op_context.input->type == kTfLiteFloat16 was not true.
ERROR: Node number 3 (DEQUANTIZE) failed to prepare.
  

Ответ №1:

Причина в том, что DEQUANTIZE of еще не поддерживается в tf до tf2.4 для вывода полностью 8-битных целых чисел. Следовательно, решение состоит в том, чтобы вернуться к tf.1x или использовать вместо этого tf2.4

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

1. Привет, у меня такая же проблема, но я уже использую tf 2.4.1, разве вы не упоминали, что это должно работать в 2.4?

2. Да, это должно сработать. Квантование в значительной степени связано с типом слоев модели. Поэтому, если вы не уверены в этом. Пусть все они выполняются с более высокой точностью. Но я думаю, что для конкретного вывода tf1.x является лучшим. Tf2.x все еще работает с квантованием.