Во-первых, вам нужно добавить генератор данных, чтобы иметь репрезентативные входы для преобразователя. Точно так же:
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
слоями.