Я использую TensorFlow 2.1 для обучения моделей с обучением с учетом квантования.
Код для этого:
import tensorflow_model_optimization as tfmot
model = tfmot.quantization.keras.quantize_annotate_model(model)
Это добавит узлы поддельного квантования в график. Эти узлы должны корректировать веса модели, чтобы их было легче квантовать в int8 и работать с данными int8.
Когда обучение заканчивается, я конвертирую и квантую модель в TF-Lite следующим образом:
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = [give data provider]
quantized_tflite_model = converter.convert()
На этом этапе я бы не ожидал увидеть слои поддельного квантования на графике TL-Lite. Но, что удивительно, я их вижу. Более того, когда я запускаю эту квантованную модель в TF-Lite C ++ sample app , я вижу, что она также запускает узлы поддельного квантования во время вывода. В дополнение к этому, он также деквантовывает и квантовывает активации между каждым слоем.
Это пример вывода кода C ++:
Встроенный код оператора узла 0 80 FAKE_QUANT
Входы: 1
Выходы: 237
Встроенный код оператора узла 1 114 QUANTIZE
Входы: 237
Выходы: 238
Встроенный код оператора узла 2 3 CONV_2D
Входы: 238 59 58
Выходы: 167
Времена: 378
Встроенный код оператора узла 3 6 DEQUANTIZE
Входы: 167
Выходы: 239
Встроенный код оператора узла 4 80 FAKE_QUANT
Входы: 239
Выходы: 166
Встроенный код оператора узла 5 114 QUANTIZE
Входы: 166
Выходы: 240
Встроенный код оператора узла 6 3 CONV_2D
Входы: 240 61 60
Выходы: 169
Так что я нахожу все это очень странным, учитывая также тот факт, что эта модель должна работать только на int8, и фактически узлы фальшивого квантования получают float32 в качестве входных данных.
Любая помощь ей e был бы признателен.