tflite квантование, как изменить входной dtype - PullRequest
1 голос
/ 18 июня 2020

см. Возможное решение в конце сообщения


Я пытаюсь полностью квантовать модель keras-vggface из rcmalli для запуска на НПУ. Модель является моделью Keras (не tf.keras).

При использовании TF 1.15 для квантования с:

print(tf.version.VERSION)
num_calibration_steps=5

converter = tf.lite.TFLiteConverter.from_keras_model_file('path_to_model.h5')        

#converter.post_training_quantize = True  # This only makes the weight in8 but does not initialize model quantization  
def representative_dataset_gen():
    for _ in range(num_calibration_steps):
        pfad='path_to_image(s)'
        img=cv2.imread(pfad)
        # Get sample input data as a numpy array in a method of your choosing.
        yield [img]
converter.representative_dataset = representative_dataset_gen
tflite_quant_model = converter.convert()
open("quantized_model", "wb").write(tflite_quant_model)

Модель преобразована, но поскольку мне нужно полное квантование int8, я добавляю :

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

Появляется это сообщение об ошибке:

ValueError: Невозможно установить тензор: Получено значение типа UINT8, но ожидаемый тип FLOAT32 для входа 0, имя: input_1

очевидно, вход модели по-прежнему требует float32.

Вопросы :

  1. Нужно ли мне адаптировать метод квантования, который вводится dtype изменен? или
  2. Нужно ли мне заранее изменить входной слой модели на dtype int8?
  3. Или это действительно сообщение о том, что модель на самом деле не квантована?

Если 1 или 2 - это ответ, не могли бы вы дать мне лучший практический совет?


Добавление :

Использование:

h5_path = 'my_model.h5'
model = keras.models.load_model(h5_path)
model.save(os.getcwd() +'/modelTF2') 

для сохранения h5 как pb с TF 2.2, а затем с использованием converter=tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)

, поскольку TF 2.x tflite принимает числа с плавающей запятой и конвертирует их в uint8s внутренне . Я подумал, что это может быть решением. К сожалению, появляется это сообщение об ошибке:

tf.lite.TFLiteConverter.from_keras_model, дающий объект 'str', не имеет атрибута 'call'

Очевидно, TF2.x не может обрабатывать чистый модели keras.

использование tf.compat.v1.lite.TFLiteConverter.from_keras_model_file() для решения этой ошибки просто повторяет ошибку, описанную выше, поскольку мы снова вернулись на уровень «TF 1.15».


Добавление 2

Еще одно решение - перенести модель keras в tf.keras вручную. Я изучу это, если не будет другого решения.


Относительно комментария Мегхны Натрадж

Чтобы воссоздать модель (с использованием TF 1.13 .x) только:

pip install git+https://github.com/rcmalli/keras-vggface.git

и

from keras_vggface.vggface import VGGFace   
pretrained_model = VGGFace(model='resnet50', include_top=False, input_shape=(224, 224, 3), pooling='avg')  # pooling: None, avg or max
pretrained_model.summary()
pretrained_model.save("my_model.h5") #using h5 extension

Входной слой подключен. Жаль, это выглядело как хорошее / простое решение. summary of the first few layers of the VGGface model


Возможное решение

Кажется, работает с TF 1.15.3 Я использовал 1.15.0 заранее. Я проверю, не сделал ли я случайно что-то другое.

1 Ответ

1 голос
/ 18 июня 2020

Возможная причина, по которой это не удается, состоит в том, что модель имеет входные тензоры, которые не связаны с выходным тензором, т.е. они, вероятно, не используются.

Вот блокнот colab где я воспроизвел эту ошибку. Измените io_type в начале записной книжки на tf.uint8, чтобы увидеть ошибку, аналогичную той, которую вы получили.

РЕШЕНИЕ

Вам необходимо вручную проверить модель и проверить, есть ли какие-либо входы, которые болтаются / потеряны / не подключены к выходу, и удалите их.

Разместите ссылку на модель, и я тоже могу попробовать ее отладить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...