Tensorflow hub.load Модель для TFLite - PullRequest
1 голос
/ 04 мая 2020

Я пытаюсь преобразовать модель, загруженную с помощью hub.load, в TFLite. Рассматриваемая модель - кодировщик универсальных предложений (4), найденный в https://tfhub.dev/google/universal-sentence-encoder/4, который я пробовал в Python с версиями Tensorflow 2.1.0 и 2.2.0

import tensorflow as tf
import tensorflow_hub as hub

model = hub.load("https://tfhub.dev/google/universal-sentence-encoder/4")
converter = tf.lite.TFLiteConverter.from_keras_model(model )
converter.experimental_new_converter = True // tried with and without
tflite_model = converter.convert()

I получить следующую ошибку:

    converter = tf.lite.TFLiteConverter.from_keras_model(model)
  File "...\lib\site-packages\tensorflow_core\lite\python\lite.py", line 394, in from_keras_model
    if not isinstance(model.call, _def_function.Function):
AttributeError: '_UserObject' object has no attribute 'call'

Насколько я понимаю, hub.load возвращает Keras SavedModel, поэтому не должен быть конвертируемым сразу?

1 Ответ

2 голосов
/ 04 мая 2020

Попробуйте использовать hub.KerasLayer, чтобы загрузить модель в tf.keras.Model, а затем преобразовать ее в ŧflite, используя .from_keras_model.

Нет такой вещи, как "keras SavedModel". Есть SavedModel, то есть .pb file + assets folder + variables folder. Это как формат файла, способ хранения вашей модели. Это не имеет ничего общего с памятью tf.keras.Model s. hub.load не возвращает tf.keras.Model, а скорее "наиболее универсальную c вещь", которую вы можете сохранить в формате SavedModel, а именно _UserObject. Это потому, что вы можете сохранять другие вещи, кроме tf.keras.Models s, в формате SavedModel s.

Я знаю, что это был не ваш вопрос, но если вы делаете хотите вернуть tf.keras.Model после загрузки, вы можете использовать tf.keras.save_model, чтобы сохранить его. Затем он вернется как tf.keras.Model после загрузки с использованием tf.saved_model.load (так что это больше не самая общая c вещь).

РЕДАКТИРОВАТЬ:

Просто код:

import tensorflow as tf
import tensorflow_hub as hub 
model = tf.keras.Sequential()
model.add(tf.keras.layers.InputLayer(dtype=tf.string, input_shape=()))
model.add(hub.KerasLayer("https://tfhub.dev/google/universal-sentence-encoder/4"))
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

, который работает (он начинает преобразование), но вы получаете:

2020-05-05 10:48:44.927433: I tensorflow/lite/toco/import_tensorflow.cc:659] Converting unsupported operation: StatefulPartitionedCall

Так этот является кодом для преобразования моделей, сохраненных в формате SavedModel в tflite, но вы получаете ошибку google-universal-sentence-encoder Speci c. Не знаю, как это исправить.

...