Tensorflow - ошибка преобразования модели h5 в tflite
Я сделал учебный перевод с использованием предварительно обученной модели InceptionV3 и сохранил файл модели h5. После этого я могу делать прогнозы. Теперь я хочу преобразовать модель h5 в файл tflite, используя метод TFLiteConverter.convert(), например так:
converter = lite.TFLiteConverter.from_keras_model_file('keras.model.h5')
tflite_model = converter.convert()
но я получаю эту ошибку:
File "from_saved_model.py", line 28, in <module>
tflite_model = converter.convert()
File "C:\Anaconda3\lib\site-packages\tensorflow\contrib\lite\python\lite.py", line 409, in convert
"invalid shape '{1}'.".format(_tensor_name(tensor), shape))
ValueError: None is only supported in the 1st dimension. Tensor 'input_1' has invalid shape '[None, None, None, 3]'
Я использую Anaconda Python 3.6.8 в Windows 10 64 бит. Заранее спасибо за вашу помощь!
1 ответ
Только размер партии (индекс 0) может быть None
при преобразовании модели из TensorFlow в TensorFlow Lite. Вы должны быть в состоянии использовать input_shapes
аргумент при звонке from_keras_model_file
чтобы получить форму входного массива, чтобы быть действительным. Для модели InceptionV3 input_shapes
аргумент часто {'Mul' : [1,299,299,3]}
,
Документация для TFLiteConverter.from_keras_model_file
доступно здесь. Принятые параметры следующие (скопировано из документации):
from_keras_model_file(
cls,
model_file,
input_arrays=None,
input_shapes=None,
output_arrays=None
)
- загрузить keras.model.h5
- установите input_shape, просто избегайте [None, None, None, 3]
- сохранить его как новую модель.
- Преобразуйте его, используя код, который вы отправили в вопросе.
Batch_size - это единственное измерение, которое можно задать как none.
Первое измерение в input_shape - это batch_size, второе и третье измерения указывают размер ввода изображения, а последнее измерение указывает количество каналов (RGB).
Чтобы избежать полученной ошибки, заранее укажите размеры.
Этого можно достичь с помощью toco (инструмента, который напрямую преобразует полученную модель keras в.tflite, не конвертируя ее сначала в модель.pb, а затем в модель.tflite). Используя аргумент input_shape в toco, вы можете указать размеры input_shape вашей модели keras.
Установите toco для python, а затем выполните следующую команду,
toco --output_file = output_model.tflite --keras_model_file = keras.model.h5 --input_arrays input_1 --input_shape 1,299,299,3
Здесь размер batch_size может отличаться в зависимости от вашей модели. Что касается размеров ввода, то 299x299 - это размер ввода по умолчанию для моделей InceptionV3.