2

我按照教程(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)

运行 summarise_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文件的正确方法是什么?

谢谢!

4

1 回答 1

2

我通过干净的 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 错误,而是 toco 抱怨此文件中的两个问题inception_v3_quantized_graph.pb

  1. 数组(TensorFlow 用语中的“张量”)缺少最小-最大范围信息。这是此错误消息的直接原因。
  2. 此图中的运算符是QuantizeV2。Toco 不知道这种类型的运算符。这不是此错误消息的直接主题,但如果您超过了这一点,您稍后会遇到一个真正的问题。

TensorFlow Lite 带来了一种新的量化方法,它与您之前提到的现有 TensorFlow 文档和工具中所做的不同。您在这里遇到的错误归结为尝试使用 TensorFlow Lite 转换器,该转换器期望在新方法中量化图,并使用旧方法量化图。

我们正在记录新的量化方法。

同时,您可能已经可以通过这些提示进行试验了。新的量化方法需要在浮点训练图中插入“假量化”节点,如下所述: https ://www.tensorflow.org/versions/r0.12/api_docs/python/array_ops/fake_quantization

这些节点的目的是在训练期间准确模拟 8 位量化的准确性影响,并记录用于该量化的准确最小-最大范围。必须将这些节点放置在正确的位置,因为量化训练的目的是允许在推理中重现完全相同的算法,并且量化推理需要实现整个融合层(Conv + BiasAdd + ReLU),(全连接+ BiasAdd + ReLU)作为单个融合操作。因此,应放置 fake_quant 节点:

  • 在激活函数之后(例如在 ReLU 的输出上)的每个(融合)层的输出激活(例如 Conv+BiasAdd+ReLU)。不是之前(不在 BiasAdd 周围)。
  • 在Conv/FullyConnected 操作消耗之前的 Conv/完全连接权重。
  • 不要将 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

另请注意,如果您只对评估性能感兴趣而不关心实际准确性,那么您可以使用“虚拟量化”——直接在普通浮点图上运行 toco 量化,而无需处理虚假量化和重新训练。只是不要在您的实际应用程序中使用它! 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-浮动图

祝你好运!

于 2017-11-27T21:46:27.267 回答