tensorflow Quantize(量化)

Posted 血影雪梦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tensorflow Quantize(量化)相关的知识,希望对你有一定的参考价值。

PS1:Quantize Neural Networks 的内容见此文章:
        https://petewarden.com/2016/05/03/how-to-quantize-neural-networks-with-tensorflow/
PS2:我使用的是 tensorflow 1.1

1,安装
        1.1 下载源码(之后用 tensorflow_root 来代指进入源码的第一层目录)
                git clone https://github.com/tensorflow/tensorflow.git
        1.2 进入 tensorflow_root 目录
                cd tensorflow
        1.3 编译 label_image
                ./configure
                bazel build --config=mkl --copt="-DEIGEN_USE_VML" -c opt tensorflow/examples/label_image:label_image
        1.4 编译 quantize(与 PS 中文章的步骤不同,这里要使用这个命令)
                bazel build --config=mkl --copt="-DEIGEN_USE_VML" -c opt tensorflow/tools/quantization:quantize_graph
        1.5 编译 tensorflow
                bazel build --config=mkl --copt="-DEIGEN_USE_VML" -c opt //tensorflow/tools/pip_package:build_pip_package
        1.6 生成 pip 包
                mkdir -p /tmp/tensorflow/
                bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow/
        1.7 安装
                pip install /tmp/tensorflow/tensorflow*.whl


2,压缩 pb
        2.1 curl http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz -o /tmp/inceptionv3.tgz
        2.2 tar xzf /tmp/inceptionv3.tgz -C /tmp/
        2.3 在 tensorflow_root 中执行如下命令:
                bazel-bin/tensorflow/tools/quantization/quantize_graph \\
                --input=/tmp/classify_image_graph_def.pb \\
                --output_node_names="softmax" --output=/tmp/quantized_graph.pb \\
                --mode=eightbit
        2.4 结果验证:
                运行命令 ls -lh /tmp 发现多了个 quantized_graph.pb,对比大小如下:
                        classify_image_graph_def.pb : 92M
                        quantized_graph.pb : 24M
                真的小了好多。

3, 验证新模型
        在 tensorflow_root 目录下
        3.1 执行如下命令使用新模型
                bazel-bin/tensorflow/examples/label_image/label_image \\
                --graph=/tmp/quantized_graph.pb \\
                --labels=/tmp/imagenet_synset_to_human_label_map.txt \\
                --input_width=299 \\
                --input_height=299 \\
                --input_mean=128 \\
                --input_std=128 \\
                --input_layer="Mul:0" \\
                --output_layer="softmax:0"
        3.2 执行如下命令使用原模型
                bazel-bin/tensorflow/examples/label_image/label_image \\
                --graph=/tmp/classify_image_graph_def.pb \\
                --labels=/tmp/imagenet_synset_to_human_label_map.txt \\
                --input_width=299 \\
                --input_height=299 \\
                --input_mean=128 \\
                --input_std=128 \\
                --input_layer="Mul:0" \\
                --output_layer="softmax:0"
        3.3 对比输出
                结果略有不同,但还是挺接近的。
        

以上是关于tensorflow Quantize(量化)的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow fake-quantize 层也是从 TF-Lite 调用的

Tensorflow 中 8 位量化的致命错误

Tensorflow 构建量化工具 - bazel 构建错误

facenet训练后模型使用tensorflow量化

用 TensorFlow 压缩神经网络

了解 tf.contrib.lite.TFLiteConverter 量化参数