1、使用facenent/src/freeze_graph.py将ckpt模型文件转化为pb模型文件,
需要注意的是,需要在这里面添加模型名称及scope,如下图所示,转化ResNeXt模型是需要添加ResNeXt:
2、使用bazel搭建tensorflow的quzntization工具,如下面命令所示;
$ cd ~/tensorflow/ (tensorflow的源码路径)
$ bazel build tensorflow/tools/quantization:quantize_graph
3、量化前需要修改/tensorflow/tensorflow/python/framework/graph_util_impl.py,由于“Identity”的原因有些层无法量化,使量化后的模型无法使用,需做如下图的修改:
3.1、if node.name == "input": \n continue解决了由于“Identity”不将input层量化的错误;
3.2、re.match(r".*/cond.*", input_name)能够结果下面的错误:
ValueError: graph_def is invalid at node 'InceptionResnetV1/Conv2d_1a_3x3/BatchNorm/cond/AssignMovingAvg/decay': More inputs specified ('InceptionResnetV1/Conv2d_1a_3x3/BatchNorm/cond/Switch:1') than the op expects.
4、量化指令:
bazel-bin/tensorflow/tools/quantization/quantize_graph \
--input=/tmp/classify_image_graph_def.pb \
--output_node_names="embeddings" \
--output=/tmp/quantized_graph.pb \
--mode=eightbit
参考文献:https://zhuanlan.zhihu.com/p/25323688
https://www.tensorflow.org/performance/quantization