量化 TensorFlow 图以进行推理

Quantizing a TensorFlow graph for inference

我正在尝试量化我的模型 (CNN),以便将其转换为量化的 .tflite 模型。 我正在按照教程进行操作:https://github.com/tensorflow/tensorflow/tree/r1.13/tensorflow/contrib/quantize#quantization-aware-training

首先,我通过调用在我的图中引入假量化节点:

tf.contrib.quantize.create_training_graph(quant_delay=500)

但是,最后我尝试调用此函数以确保以正确的格式导出带有量化信息的图形:

tf.contrib.quantize.create_eval_graph(input_graph=tf.get_default_graph())

我收到此错误:

ValueError: Training op found in graph, exiting {'ApplyAdam'}

事实上,在构建图表时,我有效地添加了一个 AdamOptimizer 来训练我的模型:

train_step = tf.train.AdamOptimizer(1e-4).minimize(...)

如何解决这个问题?该错误似乎表明我应该删除 Adam 优化器,尽管我需要它进行训练。

我在 TensorFlow 网页和教程以及其他论坛上找不到任何关于此的帮助。希望你能帮帮我

提前致谢

这可能有点复杂,但您需要创建两个独立且不同的图表,一个用于训练,一个用于导出。查看 this gist 训练示例,然后使用量化感知训练、导出和转换进行微调。

步骤 1)

在训练图中,您正常创建直到丢失的所有内容,然后在使用优化器添加 train_op 之前调用 tf.contrib.quantize.create_training_graph(...)。训练您的模型然后创建检查点,您可以通过 tf.estimator API 或定期在 tf.Session.

中执行此操作

步骤 2)

然后你需要创建一个推理图,你甚至不要让这里的损失函数只是你模型的推理部分。之后调用 tf.contrib.quantize.create_eval_graph(...) 添加量化操作。 最后,您只需从训练中创建的检查点恢复,然后将 frozengraph 或 savedmodel 导出为您想要的格式。


步骤 3)

使用 toco 将 frozengraph/savedmodel 转换为 tflite。