Получите полностью квантованную модель TfLite, также с вводом и выводом в int8

Я квантовал модель Keras h5 (TF 1.13; модель keras_vggface) с помощью Tensorflow 1.15.3, чтобы использовать ее с NPU. Код, который я использовал для преобразования:

converter = tf.lite.TFLiteConverter.from_keras_model_file(saved_model_dir + modelname)  
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset_gen
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8  # or tf.uint8
converter.inference_output_type = tf.int8  # or tf.uint8
tflite_quant_model = converter.convert()

Полученная квантованная модель на первый взгляд выглядит хорошо. Типы входных слоев - int8, filter - int8, смещение - int32, а выходное - int8.

Однако модель имеет слой квантования после входного слоя, а входной слой - это float32 [см. Изображение ниже]. Но похоже, что NPU также должен быть int8.

Есть ли способ полностью квантовать без слоя преобразования, но также с int8 в качестве входных данных?

Как вы видите выше, я использовал:

 converter.inference_input_type = tf.int8
 converter.inference_output_type = tf.int8

ИЗМЕНИТЬ

РЕШЕНИЕ от пользователя dtlam

Несмотря на то, что модель по-прежнему не работает с Google NNAPI, решение для квантования модели с входом и выходом в int8 с использованием либо TF 1.15.3, либо TF2.2.0, благодаря delan:

...
converter = tf.lite.TFLiteConverter.from_keras_model_file(saved_model_dir + modelname) 
        
def representative_dataset_gen():
  for _ in range(10):
    pfad='pathtoimage/000001.jpg'
    img=cv2.imread(pfad)
    img = np.expand_dims(img,0).astype(np.float32) 
    # Get sample input data as a numpy array in a method of your choosing.
    yield [img]
    
converter.representative_dataset = representative_dataset_gen

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 
converter.inference_output_type = tf.int8 
quantized_tflite_model = converter.convert()
if tf.__version__.startswith('1.'):
    open("test153.tflite", "wb").write(quantized_tflite_model)
if tf.__version__.startswith('2.'):
    with open("test220.tflite", 'wb') as f:
        f.write(quantized_tflite_model)

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


person Florida Man    schedule 09.09.2020    source источник


Ответы (1)


Если вы применили квантование после обучения, вы должны убедиться, что ваш репрезентативный набор данных не находится в float32. Кроме того, если вы хотите точно квантовать модель с вводом / выводом int8 или uint8, вам следует подумать об использовании обучения с квантованием. Это также даст вам лучший результат при кватизации  введите описание изображения здесь

Я также попытался квантовать вашу модель из изображения и кода, которые вы мне даете, и она квантуется после всего < img src = "https://i.stack.imgur.com/iLfM0.png" alt = "введите описание изображения здесь" />

person dtlam26    schedule 09.09.2020
comment
Ахххххххххххххх, это хорошо знать. Я попробую это как можно скорее. Использование квантования с учетом обучения будет использовано в крайнем случае :-) Прелесть модели в том, что она довольно хорошо предварительно обучена. Можете ли вы использовать квантование с учетом обучения также во время точной настройки? Так что просто переобучите модель на меньшем наборе int8, используя обучение с учетом квантования? Большое спасибо и удачного вам дня. - person Florida Man; 09.09.2020
comment
да, QAT помогает модели лучше работать в более низкой размерности;)). Как я вижу из вашей модели, если вы используете QAT из tf2.0, квантованная модель не может иметь входной uint8 или int8 - person dtlam26; 09.09.2020
comment
в нем четко указано, что вы должны использовать tf1.x coral.ai/docs/edgetpu/faq - person dtlam26; 09.09.2020
comment
Огромное спасибо. Приятно знать, что TF2 поддерживает только ввод float32. Я не знал об этом (я не использую TPU Google, поэтому я пропустил этот документ, ура). - person Florida Man; 09.09.2020
comment
TPU мощный, но сложный в использовании. Я провел с этим год, поэтому не стесняйтесь спрашивать, есть ли у вас проблемы - person dtlam26; 09.09.2020
comment
Рад слышать. Скорее всего, я еще вернусь к этому предложению ;-) Поговорим в ближайшее время. Ура, ян - person Florida Man; 09.09.2020
comment
Привет, я возвращаюсь к вашему предложению. Когда вы предложили изменить входной dtype данных, я столкнулся с ошибкой, которую не смог решить. Если позволяет ваше время, не могли бы вы зацикливаться? Ура stackoverflow.com/questions/63830570/ - person Florida Man; 10.09.2020
comment
вы можете показать мне код вашего репрезентативного набора данных? - person dtlam26; 10.09.2020
comment
если возможно, также дайте мне вашу модель keras - person dtlam26; 10.09.2020
comment
Привет, здесь вы найдете извлеченный код: github.com/JanderHungrige/Right-quantization и образец изображения. Я просто загружаю образец изображения в том же формате, в котором проходило обучение. Модель выложу, но для git она слишком большая. Однако вверху есть краткое описание того, как установить keras_vgg. Это простая команда pip. - person Florida Man; 10.09.2020
comment
Давайте продолжим это обсуждение в чате. - person Florida Man; 10.09.2020