为什么量化是可能的?
由于神经元只抽取必要信息并给出响应,这样整个网络是抗噪和鲁棒的。训练完成后进行推断时,减低精度的定点化量化也可以考虑为噪声,因此不会产生大影响。
如何量化和量化意义?
网络参数是按层组织,每层数值都在同一数量级,即范围相差不大,如[-6.0,4.0],有大量论文研究表明确认值最大和最小后每层数据使用8bit定点化量化已可以很好满足推断计算。
量化最直接结果是参数存储空间要求变小,经验值是减少约3/4;减少内存读取数据量,节省带宽;使用simd进行计算加速,如果有dsp进行8bit加速计算节能,使得移动设备上进行推断计算变得更强大有效。
怎么量化模型?
需要使用tensorflow提供的量化工具,使用示例如下
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
该工具需要下载tensorflow源码,安装bazel(可参见blog.csdn.net/u010510350/article/details/52247972),并进行配置和编译生成。
编译前请确认tensorflow源码下载后,已进行./configure, 这个过程会配置相关的依赖程序和库。为了使得依赖少一些,可以在configure时选择不打开一些选项。
bazel build tensorflow/tools/quantization:quantize_graph #具体路径可能会随版本变化
生成的可执行文件在bazel-bin/tensorflow/tools/quantization/quantize_graph,此时即可进行量化转化了,--help可以打开使用帮助。
此时需要了解输出节点的名称,如上“softmax”,如果你是网络的原本的开发人员,这个不是问题。如果手头得到的就是一个pb文件。那么就需要自己分析文件了。这个下个文档再介绍。