Преобразование .pb в .tflite для модели с переменной входной формой

Я работал над проблемой, когда я обучал модель с помощью API обнаружения объектов Tensorflow с использованием настраиваемого набора данных. Я использую tf версии 2.2.0

output_directory = 'inference_graph'
!python /content/models/research/object_detection/exporter_main_v2.py \
--trained_checkpoint_dir {model_dir} \
--output_directory {output_directory} \
--pipeline_config_path {pipeline_config_path}

Мне удалось успешно получить файл .pb вместе с файлом .ckpt. Но теперь мне нужно преобразовать его в .tflite. Я не могу этого сделать, произошла какая-то ошибка.

Я попробовал основной способ, который был написан в документации TensorFlow, но это тоже не сработало. Другой код, который я пробовал, приведен ниже:

    import tensorflow as tf
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Conv2D, Flatten, MaxPooling2D, Dense, Input, Reshape, Concatenate, GlobalAveragePooling2D, BatchNormalization, Dropout, Activation, GlobalMaxPooling2D
from tensorflow.keras.utils import Sequence

model = tf.saved_model.load(f'/content/drive/MyDrive/FINAL DNET MODEL/inference_graph/saved_model/')
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.post_training_quantize=True
converter.inference_type=tf.uint8
tflite_model = converter.convert()
open("val_converted_model_int8.tflite", "wb").write(tflite_model)

Я получаю следующую ошибку:

AttributeError Traceback (последний вызов последним) в () 8 converter.post_training_quantize = True 9 converter.inference_type = tf.uint8 --- ›10 tflite_model = converter.convert () 11 открыть (val_converted_model_int8.tflite, wb) .write (tflite_model )

/usr/local/lib/python3.6/dist-packages/tensorflow/lite/python/lite.py в convert (self) 837 # to None. 838 # Когда у нас будет лучшая поддержка динамических фигур, мы сможем это удалить. - ›839 if not isinstance (self._keras_model.call, _def_function.Function): 840 # Pass keep_original_batch_size=True гарантирует, что мы получим входную подпись 841 #, включая размер пакета, указанный пользователем.

AttributeError: объект '_UserObject' не имеет атрибута 'call'

Может ли кто-нибудь помочь мне с этим?


person Mr.J    schedule 12.02.2021    source источник


Ответы (1)


Я думаю, проблема не в форме ввода переменной (хотя сообщение об ошибке сбивает с толку).

tf.saved_model.load возвращает SavedModel, но tf.lite.TFLiteConverter.from_keras_model ожидает, что модель Keras не может с ней справиться.

Вам необходимо использовать API TFLiteConverter.from_saved_model. Что-то вроде этого:

saved_model_dir = '/content/drive/MyDrive/FINAL DNET MODEL/inference_graph/saved_model/'
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)

Сообщите нам, если у вас возникнут другие проблемы.

person miaout17    schedule 12.02.2021
comment
Код работал без ошибок, но файл tflite не был сохранен. вместо этого дал это предупреждение: ПРЕДУПРЕЖДЕНИЕ: absl: импорт функции (__inference_EfficientDet-D0_layer_call_and_return_conditional_losses_90785) с операциями с настраиваемыми градиентами. Скорее всего, не удастся, если будет запрошен градиент. Мне нужно написать этот файл или еще что-нибудь? так как выхода нет. Я только что работаю с моделями tf. - person Mr.J; 13.02.2021
comment
Если вы запустили model = converter.convert(), но он вернул пустую строку без ошибок, скорее всего, это ошибка. Сможете ли вы сообщить о проблеме на Github, выполнив воспроизводимые действия? Спасибо! - person miaout17; 14.02.2021
comment
Я говорил о коде, который вы дали: converter = tf.lite.TFLiteConverter.from_saved_model (saved_model_dir). - person Mr.J; 14.02.2021