不支持的TensorFlow操作:去量化

时间:2018-05-03 10:53:19

标签: python tensorflow deep-learning

使用Tensorflow 1.6.0

将mobilenet量化模型的retrained_graph.pb转换为tf-lite

toco --input_format=TENSORFLOW_GRAPHDEF   --input_file=/home/sudheer_sure/r_mobil
enet/tf_files/retrained_graph.pb   --output_format=TFLITE   --output_file=/home/sudheer_sure/r_mobilenet/tf_files/mobilenet_v1_1.0_224_quantized.lite   --inference_type=QUANTI
ZED_UINT8   --inference_input_type=QUANTIZED_UINT8   --input_arrays=input   --output_arrays=final_result   --input_shapes=1,224,224,3  --mean_values=128   --std_values=128 --d
efault_ranges_min=0 --default_ranges_max=6

收到以下错误:

  

未实现:此图包含类型的运算符(Unsupported   TensorFlow op:Dequantize)尚未量化形式   实现。对不起,欢迎补丁(这是一个相对有趣的补丁   写,主要提供实际的量化算术代码   这个操作。

任何人都可以帮助我

2 个答案:

答案 0 :(得分:0)

在尝试使用toco工具将protobuf(pb)文件(使用graph_transforms工具进行优化/量化后)转换为tflite时,我也遇到了同样的问题。

再训练>>使用graph_transforms >> toco进行量化/舍入[不工作]

但是当我使用原始的经过重新训练的pb文件作为toco的输入时,它对我有用。

再培训>> toco [工作]

以下命令有效:

bazel-bin/tensorflow/contrib/lite/toco/toco --input_file=~/tf_files/retrained_graph_mobileNet_v2_100_224_card.pb --output_file=~/tf_files/retrained_graph_mobileNet_v2_100_224_q_card.tflite --input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE --inference_type=QUANTIZED_UINT8 --input_shape=1,224,224,3 --input_array='Placeholder' --output_array='final_result' --mean_value=128 --std_value=128 --default_ranges_min=0 --default_ranges_max=6

您使用哪种型号的Inception / mobilener? 确保input_array和output_array与pb图中使用的相同。

答案 1 :(得分:0)

量化的.tflite的目的是将所有内容保留为8位。如果我们使用tfliteConverter / TOCO将fp32 pb转换为tflite 8bit,则不会引入Dequantize层(与使用动态范围捕获的Graph Transform工具相反)。

此外,一个8位tflite模型必须在每层上保留最小/最大范围才能进行激活(权重每个通道的未来支持)。

  1. 这些范围用于将int32从卷积转换回8bit。
  2. 这些范围应该通过fakeQuant图层捕获,在重新训练/微调时必须在图中将其引入。
  3. 如果这些范围不可用,则可以使用虚拟量化,但是由于每一层都设置了相同的范围,因此准确性会下降。

这是生成完全量化的8位tflite的官方方法。当然,tflite工具正在开发中,并且不支持某些操作。

使用8bit的旧版路径(“图形转换”工具),我们可以选择在图形中引入打印操作,使用校准数据集捕获范围,并冻结8bit.pb模型中的范围(最小/最大)。无需重新培训。

不幸的是,tflite不支持这种“后训练量化”。