см. Возможное решение в конце сообщения
Я пытаюсь полностью квантовать модель 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.
Вопросы :
- Нужно ли мне адаптировать метод квантования, который вводится dtype изменен? или
- Нужно ли мне заранее изменить входной слой модели на dtype int8?
- Или это действительно сообщение о том, что модель на самом деле не квантована?
Если 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
Входной слой подключен. Жаль, это выглядело как хорошее / простое решение.
Возможное решение
Кажется, работает с TF 1.15.3 Я использовал 1.15.0 заранее. Я проверю, не сделал ли я случайно что-то другое.