Модель Tensorflow для TFLITE - PullRequest
       83

Модель Tensorflow для TFLITE

0 голосов
/ 01 апреля 2020

У меня есть этот код для создания поисковой системы semanti c, использующей предварительно обученный универсальный кодировщик из концентратора тензорного потока. Я не могу конвертировать в tlite. Я сохранил модель в своем каталоге.

Импорт модели:

module_path ="/content/drive/My Drive/4"
%time model = hub.load(module_path)
#print ("module %s loaded" % module_url)

#Create function for using modeltraining
def embed(input):
    return model(input)

Обучение модели по данным:

## training the model
Model_USE= embed(data)

Сохранение модели:

exported = tf.train.Checkpoint(v=tf.Variable(Model_USE))
exported.f = tf.function(
    lambda  x: exported.v * x,
    input_signature=[tf.TensorSpec(shape=None, dtype=tf.float32)])
export_dir = "/content/drive/My Drive/"
tf.saved_model.save(exported,export_dir)

Сохранение работает нормально, но при преобразовании в tflite выдает ошибку.

Код преобразования:

converter = tf.lite.TFLiteConverter.from_saved_model(export_dir)
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS,
                                       tf.lite.OpsSet.SELECT_TF_OPS]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

Ошибка:

as_list() is not defined on an unknown TensorShape.

1 Ответ

1 голос
/ 03 апреля 2020

Во-первых, вам нужно добавить генератор данных, чтобы иметь репрезентативные входы для преобразователя. Точно так же:

def representative_data_gen():
  for input_value in dataset.take(100):
    yield [input_value]

input value должен иметь форму (1, your_iput_shape), как если бы он имел пакетную форму 1. Он должен быть получен в виде списка; обязательно.

Вы также должны указать, какой тип оптимизации вы хотите, например:

converter.optimizations = [tf.lite.Optimize.OPTIMIZE_FOR_SIZE]

Тем не менее, я также столкнулся с проблемами с различными опциями конвертера в зависимости от сети. структура, которой в данном случае я не знаю. Таким образом, чтобы выполнить чистую работу преобразователя, я бы просто сделал:

converter = lite.TFLiteConverter.from_keras_model(model)
converter.experimental_new_converter = True
converter.optimizations = [lite.Optimize.DEFAULT]
tfmodel = converter.convert()

converter.experimental_new_converter = True для проблем при преобразовании RNN, как в https://github.com/tensorflow/tensorflow/issues/34813

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

Как объяснено здесь: ValueError: Ни один не поддерживается только в 1-м измерении. Тензор 'flatbuffer_data' имеет недопустимую форму '[None, None, 1, 512]' TFLite позволяет только первому измерению ваших данных быть None, то есть пакету. Все остальные размеры должны быть фиксированными. Попробуйте дополнить их, например, tf.keras.preprocessing.sequence.pad_sequences.

Затем замаскируйте свои последовательности в сети, как описано в: tensorflow.org/guide/keras/masking_and_padding с Embedding или Masking слоями.

...