tensorflow lite: ошибка преобразования для квантованного графического определения

Я следил за руководством (https://www.tensorflow.org/performance/quantization), чтобы сгенерируйте квантованный файл graphdef:

curl -L "https://storage.googleapis.com/download.tensorflow.org/models/inception_v3_2016_08_28_frozen.pb.tar.gz" | tar -C tensorflow/examples/label_image/data -xz
bazel build tensorflow/tools/graph_transforms:transform_graph
bazel-bin/tensorflow/tools/graph_transforms/transform_graph \
  --in_graph=tensorflow/examples/label_image/data/inception_v3_2016_08_28_frozen.pb \
  --out_graph=/tmp/inception_v3_quantized_graph.pb \
  --inputs=input \
  --outputs=InceptionV3/Predictions/Reshape_1 \
  --transforms='add_default_attributes strip_unused_nodes(type=float, shape="1,299,299,3")
remove_nodes(op=Identity, op=CheckNumerics) fold_constants(ignore_errors=true)
fold_batch_norms fold_old_batch_norms quantize_weights quantize_nodes
strip_unused_nodes sort_by_execution_order'

Затем преобразуйте квантованный graphdef в файл tflite:

    bazel-bin/tensorflow/contrib/lite/toco/toco \
  --input_file=/tmp/inception_v3_quantized_graph.pb\
  --output_file=/tmp/inception_v3_quantized_graph.lite \
  --input_format=TENSORFLOW_GRAPHDEF \
  --output_format=TFLITE \
  --inference_type=QUANTIZED_UINT8 --input_type=QUANTIZED_UINT8\
  --input_shape=1,299,299,3 \
  --input_array=input \
  --output_array=InceptionV3/Predictions/Reshape_1 \
  --mean_value=128 \
  --std_value=127

Не удалось с ошибкой:

2017-11-23 12:36:40.637143: F tensorflow/contrib/lite/toco/tooling_util.cc:549] Check failed: model.arrays.count(input_array.name()) Input array not found: input
Aborted (core dumped)

Запустите инструмент summarize_graph

bazel-bin/tensorflow/tools/graph_transforms/summarize_graph \
  --in_graph=/tmp/inception_v3_quantized_graph.pb

Входной узел существует.

Found 1 possible inputs: (name=input, type=float(1), shape=[1,299,299,3])
No variables spotted.
Found 1 possible outputs: (name=InceptionV3/Predictions/Reshape_1, 
op=Dequantize)
Found 23824934 (23.82M) const parameters, 0 (0) variable parameters, and 268 
control_edges
Op types used: 673 Const, 214 Requantize, 214 RequantizationRange, 134 Reshape, 134 Max, 134 Min, 134 QuantizeV2, 95 QuantizedConv2D, 94 QuantizedRelu, 94 QuantizedAdd, 49 Dequantize, 24 QuantizedMul, 15 ConcatV2, 10 QuantizedAvgPool, 4 QuantizedMaxPool, 2 QuantizedReshape, 1 QuantizedBiasAdd, 1 Placeholder, 1 Softmax, 1 Squeeze

Я что-нибудь пропустил? Как правильно преобразовать квантованный файл graphdef в файл tflite?

Спасибо!


person magenta    schedule 23.11.2017    source источник


Ответы (1)


Я воспроизвел ваши командные строки с чистой проверкой TF (точная фиксация).

Я получаю ошибку Toco, но не такую, как вы:

F tensorflow/contrib/lite/toco/tooling_util.cc:1155] Array InceptionV3/InceptionV3/Conv2d_1a_3x3/BatchNorm/batchnorm/mul_eightbit/input__port__0/min, which is an input to the (Unsupported TensorFlow op: QuantizeV2) operator producing the output array InceptionV3/InceptionV3/Conv2d_1a_3x3/BatchNorm/batchnorm/mul_eightbit/input__port__0/quantize, is lacking min/max data, which is necessary for quantization. Either target a non-quantized output format, or change the input graph to contain min/max information, or pass --default_ranges_min= and --default_ranges_max= if you do not care about the accuracy of results.

Это не ошибка toco, а скорее жалоба на две проблемы в этом файле inception_v3_quantized_graph.pb:

  1. В массиве («тензор» на языке TensorFlow) отсутствует информация о минимальном и максимальном диапазоне. Это непосредственная причина появления этого сообщения об ошибке.
  2. Оператор на этом графике - QuantizeV2. Токо не знает об этом типе операторов. Это не является непосредственной темой данного сообщения об ошибке, но это реальная проблема, с которой вы столкнетесь позже, если пройдете через этот момент.

TensorFlow Lite предлагает новый подход к квантованию, который отличается от того, который использовался ранее в существующей документации и инструменте TensorFlow, о которых вы упомянули. Ошибки, которые вы здесь получаете, сводятся к попытке использовать конвертер TensorFlow Lite, который ожидает квантования графиков в новом подходе с графиком, квантованным в старом подходе.

Мы находимся в процессе документирования нового подхода к квантованию.

Между тем, вы могли бы уже поэкспериментировать с этими несколькими подсказками. Новый подход к квантованию требует вставки узлов «поддельного квантования» в ваш обучающий граф с плавающей запятой, как описано здесь: https://www.tensorflow.org/versions/r0.12/api_docs/python/array_ops/fake_quantization

Назначение этих узлов - точно моделировать влияние точности 8-битного квантования во время обучения и записывать точные диапазоны min-max, используемые для этого квантования. Очень важно разместить эти узлы в нужных местах, поскольку цель квантованного обучения состоит в том, чтобы позволить воспроизводить точно такую ​​же арифметику в логическом выводе, а квантованный вывод должен реализовывать целые объединенные слои (Conv + BiasAdd + ReLU), (полностью связанные + BiasAdd + ReLU) как единая объединенная операция. Соответственно, должны быть размещены узлы fake_quant:

  • На активациях вывода каждого (объединенного) слоя (например, Conv + BiasAdd + ReLU) после функции активации (например, на выходе ReLU). Не раньше (не вокруг BiasAdd).
  • На весах Conv / с полным подключением непосредственно перед тем, как они будут использованы оператором Conv / FullyConnected.
  • Не размещайте узлы fake_quantization на векторах смещения.

Это лишь поверхностная часть этой сложной темы, поэтому нам нужно время, чтобы получить хорошую документацию по ней! С другой стороны, как правило, должна быть возможность использовать метод проб и ошибок, позволяющий сообщениям об ошибках toco направлять вас к правильному размещению узлов fake_quantization.

После того, как вы разместили узлы fake_quantization, выполните повторное обучение в TensorFlow, как обычно, freeze_graph, как обычно, затем запустите toco, как в этом примере: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/toco/g3doc/cmdline_examples.md#convert-a-tensorflow-graphdef-to-tensorflow-lite-for-quantized-inference

Также обратите внимание, что если вас интересует только оценка производительности и вас не беспокоит фактическая точность, вы можете использовать «фиктивное квантование» - выполнение тококвантования непосредственно на простом графе с плавающей запятой без необходимости иметь дело с поддельным квантованием и повторным обучением. Только не используйте это в своем реальном приложении! https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/toco/g3doc/cmdline_examples.md#use-dummy-quantization-to-try-out-quantized-inference-on-a-float-graph

Удачи!

person Benoit Jacob    schedule 27.11.2017