Конвертировать модель Keras MobileNet в TFLite с 8-битным квантованием - PullRequest
0 голосов
/ 27 ноября 2018

Я использовал Keras для настройки MobileNet v1.Теперь у меня есть model.h5, и мне нужно преобразовать его в TensorFlow Lite, чтобы использовать его в приложении для Android.

Я использую преобразование TFLite script tflite_convert.Я могу преобразовать его без квантования, но мне нужно больше производительности, поэтому мне нужно выполнить квантование.

Если я запусту этот скрипт:

tflite_convert --output_file=model_quant.tflite \
 --keras_model_file=model.h5 \
 --inference_type=QUANTIZED_UINT8 \
 --input_arrays=input_1 \
 --output_arrays=predictions/Softmax \
 --mean_values=128 \
 --std_dev_values=127 \
 --input_shape="1,224,224,3" 

Сбой:

F tenorflow / contrib / lite / toco / tooling_util.cc: 1634] Массив conv1_relu / Relu6, который является входом для оператора DepthwiseConv, создающего выходной массив conv_dw_1_relu / Relu6, не содержит данных min / max, которые необходимы для квантования.Если точность имеет значение, либо нацеливайтесь на неквантованный выходной формат, либо запустите квантованное обучение с вашей моделью из контрольной точки с плавающей запятой, чтобы изменить входной график, содержащий минимальную / максимальную информацию.Если вас не волнует точность, вы можете передать --default_ranges_min = и --default_ranges_max = для удобства экспериментов. \ NAborted (core dumped) \ n "

Если я использую default_ranges_min иdefault_ranges_max (называемый «фиктивным квантованием»), он работает, но он предназначен только для отладки производительности без точности, как описано в журнале ошибок.

Итак, что мне нужно сделать, чтобы модель Keras была корректно квантована? Нужно ли искать лучшие default_ranges_min и default_ranges_max? Как? Или речь идет об изменениях в фазе обучения Keras?

Версии библиотеки:

Python 3.6.4
TensorFlow 1.12.0
Keras 2.2.4

1 Ответ

0 голосов
/ 29 ноября 2018

К сожалению, Tensorflow пока не предоставляет инструментарий для посттренинга для квантования каждого слоя в flatbuffer (tflite), но только в protobuf.Единственный доступный способ - это добавить на график fakeQuanization слои и перенастроить / настроить вашу модель в поезде или в калибровочном наборе.Это называется " Обучение с учетом квантования ".

Как только слои fakeQuant введены, вы можете кормить обучающий набор, и TF будет использовать их в Feed-Forward в качестве симулированного квантованияслои (типы данных fp-32, которые представляют 8-битные значения) и обратное распространение с использованием значений полной точности.Таким образом, вы можете вернуть потерю точности, вызванную квантованием.

Кроме того, слои fakeQuant собираются захватывать диапазоны для каждого слоя или для каждого канала через скользящее среднее и сохранять их в переменных min / max.

Позже вы можете извлечь определение графа и избавиться от узлов fakeQuant с помощью инструмента freeze_graph.

Наконец, модель может быть передана в tf_lite_converter (перекрестными пальцами она не будеттормоз) и извлеките u8_tflite с захваченными диапазонами.

Очень хороший технический документ, объясняющий все это, предоставлен Google здесь: https://arxiv.org/pdf/1806.08342.pdf

Надеюсь, что поможет.

...