使用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)尚未量化形式 实现。对不起,欢迎补丁(这是一个相对有趣的补丁 写,主要提供实际的量化算术代码 这个操作。
任何人都可以帮助我
答案 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模型必须在每层上保留最小/最大范围才能进行激活(权重每个通道的未来支持)。
这是生成完全量化的8位tflite的官方方法。当然,tflite工具正在开发中,并且不支持某些操作。
使用8bit的旧版路径(“图形转换”工具),我们可以选择在图形中引入打印操作,使用校准数据集捕获范围,并冻结8bit.pb模型中的范围(最小/最大)。无需重新培训。
不幸的是,tflite不支持这种“后训练量化”。