Преобразовать (объединить)BatchNorm в свертку / добавить для запуска MobileNet на TensorflowLite
Я только что закончил учебное пособие TensorFlow for Poets 2: TFLite ( https://codelabs.developers.google.com/codelabs/tensorflow-for-poets-2-tflite/). В конце урока я смог запустить MobileNet, представленный в уроке, на моем телефоне.
Сейчас я пытаюсь заменить MobileNet из учебника на MobileNet, который я обучил с нуля, используя MobileNet из репозитория Tensorflow. Тем не менее, при попытке использовать TOCO, я получаю ошибку сегментации. Если я использую optimize_for_inference
Я получаю предупреждения как
ВНИМАНИЕ: тензор потока: неправильная форма для среднего значения, найдено (0,), ожидается (32,), для узла MobilenetV1/Conv2d_0/BatchNorm/FusedBatchNorm
ВНИМАНИЕ: тензор потока: не удалось найти ожидаемый ввод Conv2D в 'MobilenetV1/Conv2d_1_depthwise/BatchNorm/FusedBatchNorm'
Я сравнил график pb-файла из учебного пособия с графиком из репозитория и заметил, что существует разница в представлении нормы пакета. По сути, пакетная норма модели, представленной в учебном пособии, имеет просто свертку с последующим добавлением, в то время как модель из репозитория имеет оператор FusedBatchNorm. Я также пытался установить fused=False
но тогда я получаю эту ошибку:
/opt/conda/lib/python3.6/site-packages/h5py/
__init__
.py: 36: FutureWarning: преобразование второго аргумента issubdtype изfloat
вnp.floating
устарела. В будущем это будет рассматриваться какnp.float64 == np.dtype(float).type
,из._conv импортировать register_converters как _register_converters
2018-05-09 11: 51: 38.419786: W tenorflow/contrib/lite/toco/toco_cmdline_flags.cc:178] --input_type устарела. Это был неоднозначный флаг, который устанавливал как --input_data_types, так и --inference_input_type. Если вы пытаетесь дополнить входной файл информацией о типе входных массивов, используйте --input_data_type. Если вы пытаетесь контролировать квантование / деквантование входных массивов действительных чисел в выходном файле, используйте --inference_input_type.
2018-05-09 11: 51: 38.781372: I tenorflow/contrib/lite/toco/import_tensorflow.cc:1057] Преобразование неподдерживаемой операции: SquaredDifference
2018-05-09 11: 51: 38.781693: I tenorflow/contrib/lite/toco/import_tensorflow.cc:1057] Преобразование неподдерживаемой операции: SquaredDifference
2018-05-09 11: 51: 38.781864: I tenorflow/contrib/lite/toco/import_tensorflow.cc:1057] Преобразование неподдерживаемой операции: SquaredDifference
2018-05-09 11: 51: 38.782019: I tenorflow/contrib/lite/toco/import_tensorflow.cc:1057] Преобразование неподдерживаемой операции: SquaredDifference
2018-05-09 11: 51: 38.782181: I tenorflow/contrib/lite/toco/import_tensorflow.cc:1057] Преобразование неподдерживаемой операции: SquaredDifference
2018-05-09 11: 51: 38.782329: I tenorflow/contrib/lite/toco/import_tensorflow.cc:1057] Преобразование неподдерживаемой операции: SquaredDifference
2018-05-09 11: 51: 38.782508: I tenorflow/contrib/lite/toco/import_tensorflow.cc:1057] Преобразование неподдерживаемой операции: SquaredDifference
2018-05-09 11: 51: 38.782663: I tenorflow/contrib/lite/toco/import_tensorflow.cc:1057] Преобразование неподдерживаемой операции: SquaredDifference
2018-05-09 11: 51: 38.782851: I tenorflow/contrib/lite/toco/import_tensorflow.cc:1057] Преобразование неподдерживаемой операции: SquaredDifference
2018-05-09 11: 51: 38.783009: I tenorflow/contrib/lite/toco/import_tensorflow.cc:1057] Преобразование неподдерживаемой операции: SquaredDifference
2018-05-09 11: 51: 38.783211: I tenorflow/contrib/lite/toco/import_tensorflow.cc:1057] Преобразование неподдерживаемой операции: SquaredDifference
2018-05-09 11: 51: 38.783352: I tenorflow/contrib/lite/toco/import_tensorflow.cc:1057] Преобразование неподдерживаемой операции: SquaredDifference
2018-05-09 11: 51: 38.783561: I tenorflow/contrib/lite/toco/import_tensorflow.cc:1057] Преобразование неподдерживаемой операции: SquaredDifference
2018-05-09 11: 51: 38.832089: I tenorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Перед общими преобразованиями графов: 656 операторов, 874 массива (0 квантовано)
2018-05-09 11: 51: 39.037810: I tenorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] После общих преобразований графа проходят операторы 1: 222, 435 массивов (0 квантовано)
2018-05-09 11: 51: 39.041366: I tenorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] Перед преобразованиями графа деквантования: 222 оператора, 435 массивов (0 квантовано)
2018-05-09 11: 51: 39.044092: I tenorflow/contrib/lite/toco/allocate_transient_arrays.cc:313] Общий выделенный размер переходного массива: 4333824 байта, теоретическое оптимальное значение: 4333696 байтов.
2018-05-09 11: 51: 39.045179: F tenorflow/contrib/lite/toco/tflite/export.cc:303] Некоторые операторы в модели не поддерживаются стандартной средой выполнения TensorFlow Lite. Если у вас есть собственная реализация для них, вы можете отключить эту ошибку с помощью --allow_custom_ops. Вот список операторов, для которых вам понадобятся пользовательские реализации: Mean, RSQRT, SquaredDifference, Squeeze.
Прервано (ядро сброшено)
Я предполагаю, что можно конвертировать FusedBatchNorm
оператор в свертку / сложение комбинации, используя TOCO или другой скрипт. Это правда? И если да, где я могу найти скрипт конвертации?
1 ответ
TOCO должен автоматически сворачивать порционные нормы независимо от того, срослись они или нет. Это общий поток:
- Модель поезда
- Сделайте модель Eval и остановитесь с помощью контрольной точки поезда ИЛИ экспортируйте сохраненную модель
- Предоставить замороженный график или SavedModel для tflite_convert
- Выполнить вывод
Вы можете столкнуться с неподдерживаемыми операциями. Чтобы избежать этого, убедитесь, что вы предоставляете правильные входные и выходные данные для вашего преобразования.
надеюсь, это поможет!
TensorFlow lite автоматически объединяет слои BachNorm, потому что в замороженном графике параметры нормы Баха постоянны. лучше попробовать tf2 nightly edition