Преобразование (объединение) BatchNorm в свертку / добавление для работы MobileNet на TensorflowLite

Я только что закончил учебник TensorFlow для поэтов 2: TFLite (https://codelabs.developers.google.com/codelabs/tensorflow-for-poets-2-tflite/#0). В конце учебного курса я смог запустить MobileNet, предоставленный в учебном пособии, на моем телефоне.

Теперь я пытаюсь заменить MobileNet из учебника на MobileNet, который я обучил с нуля, используя MobileNet из репозитория Tensorflow. Однако при попытке использовать TOCO я получаю ошибку сегментации. Если я использую optimize_for_inference, я получаю предупреждения вроде

ПРЕДУПРЕЖДЕНИЕ: тензорный поток: неправильная форма для среднего, найденного (0,), ожидаемого (32,), для узла MobilenetV1 / Conv2d_0 / BatchNorm / FusedBatchNorm

ВНИМАНИЕ: тензорный поток: не удалось найти ожидаемый ввод Conv2D в 'MobilenetV1 / Conv2doptimize_for_inferencedepthwise / 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 tensorflow / 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 tensorflow / contrib / lite / toco / import_tensorflow.cc: 1057] Преобразование неподдерживаемой операции: SquaredDifference

2018-05-09 11: 51: 38.781693: I tensorflow / contrib / lite / toco / import_tensorflow.cc: 1057] Преобразование неподдерживаемой операции: SquaredDifference

2018-05-09 11: 51: 38.781864: I tensorflow / contrib / lite / toco / import_tensorflow.cc: 1057] Преобразование неподдерживаемой операции: SquaredDifference

2018-05-09 11: 51: 38.782019: I tensorflow / contrib / lite / toco / import_tensorflow.cc: 1057] Преобразование неподдерживаемой операции: SquaredDifference

2018-05-09 11: 51: 38.782181: I tensorflow / contrib / lite / toco / import_tensorflow.cc: 1057] Преобразование неподдерживаемой операции: SquaredDifference

2018-05-09 11: 51: 38.782329: I tensorflow / contrib / lite / toco / import_tensorflow.cc: 1057] Преобразование неподдерживаемой операции: SquaredDifference

2018-05-09 11: 51: 38.782508: I tensorflow / contrib / lite / toco / import_tensorflow.cc: 1057] Преобразование неподдерживаемой операции: SquaredDifference

2018-05-09 11: 51: 38.782663: I tensorflow / contrib / lite / toco / import_tensorflow.cc: 1057] Преобразование неподдерживаемой операции: SquaredDifference

2018-05-09 11: 51: 38.782851: I tensorflow / contrib / lite / toco / import_tensorflow.cc: 1057] Преобразование неподдерживаемой операции: SquaredDifference

2018-05-09 11: 51: 38.783009: I tensorflow / contrib / lite / toco / import_tensorflow.cc: 1057] Преобразование неподдерживаемой операции: SquaredDifference

2018-05-09 11: 51: 38.783211: I tensorflow / contrib / lite / toco / import_tensorflow.cc: 1057] Преобразование неподдерживаемой операции: SquaredDifference

2018-05-09 11: 51: 38.783352: I tensorflow / contrib / lite / toco / import_tensorflow.cc: 1057] Преобразование неподдерживаемой операции: SquaredDifference

2018-05-09 11: 51: 38.783561: I tensorflow / contrib / lite / toco / import_tensorflow.cc: 1057] Преобразование неподдерживаемой операции: SquaredDifference

2018-05-09 11: 51: 38.832089: I tensorflow / contrib / lite / toco / graph_transformations / graph_transformations.cc: 39] До общих преобразований графов: 656 операторов, 874 массива (0 квантованных)

2018-05-09 11: 51: 39.037810: I tensorflow / contrib / lite / toco / graph_transformations / graph_transformations.cc: 39] После общих преобразований графа проходят 1: 222 операторов, 435 массивов (0 квантованных)

2018-05-09 11: 51: 39.041366: I tensorflow / contrib / lite / toco / graph_transformations / graph_transformations.cc: 39] Перед преобразованием графа деквантованием: 222 оператора, 435 массивов (0 квантованных)

2018-05-09 11: 51: 39.044092: I tensorflow / contrib / lite / toco / allocate_transient_arrays.cc: 313] Общий выделенный размер временного массива: 4333824 байта, теоретическое оптимальное значение: 4333696 байтов.

2018-05-09 11: 51: 39.045179: F tensorflow / contrib / lite / toco / tflite / export.cc: 303] Некоторые операторы в модели не поддерживаются стандартной средой выполнения TensorFlow Lite. Если у вас есть индивидуальная реализация для них, вы можете отключить эту ошибку с помощью --allow_custom_ops. Вот список операторов, для которых вам потребуются специальные реализации: Mean, RSQRT, SquaredDifference, Squeeze.

Прервано (ядро выгружено)

Я предполагаю, что можно преобразовать оператор FusedBatchNorm в комбинацию свертки / сложения с помощью TOCO или другого скрипта. Это правда? И если да, то где мне найти скрипт конвертации?

Пакетное нормальное представление MobileNet из учебника:  image1

Пакетное нормальное представление MobileNet из репозитория:  image2


person rhavard    schedule 09.05.2018    source источник


Ответы (2)


TOCO должен автоматически складывать нормы партии независимо от того, сплавлены они или нет. Это общий поток:

  1. Модель поезда
  2. Сделайте модель Eval и зафиксируйте ее с помощью контрольно-пропускного пункта поезда ИЛИ экспортируйте сохраненную модель
  3. Предоставьте замороженный график или SavedModel для tflite_convert
  4. Выполнить вывод

Вы можете столкнуться с неподдерживаемыми операциями. Чтобы избежать этого, убедитесь, что вы предоставляете правильные входные и выходные данные для преобразования.

надеюсь, это поможет!

person suharshs    schedule 27.07.2018

TensorFlow lite автоматически объединяет слои BachNorm, потому что в замороженном графике параметры нормы Баха постоянны. лучше попробовать tf2 nightly edition

person robert    schedule 19.08.2019