Context

我有一个基于tf.estimator.DNNClassifier的简单分类器,它在意图标签上获取文本和输出概率 . 我能够训练将模型导出为可服务的,并使用tensorflow serving服务于服务 . 问题是这个可服务性太大(大约1GB),所以我想尝试一些tensorflow graph transforms来尝试减少所服务文件的大小 .

Problem

我理解如何使用 saved_model.pb 并使用freeze_model.py创建一个可用于调用变换的新 .pb 文件 . 这些变换的结果(也是一个 .pb 文件)不是可服务的,不能与tensorflow服务一起使用 .

开发者如何来自:

saved model -> graph transforms -> back to a servable

documentation表明这肯定是可能的,但从文档到如何做到这一点根本不直观 .

What I've Tried

import tensorflow as tf

from tensorflow.saved_model import simple_save
from tensorflow.saved_model import signature_constants
from tensorflow.saved_model import tag_constants
from tensorflow.tools.graph_transforms import TransformGraph


with tf.Session(graph=tf.Graph()) as sess_meta:
    meta_graph_def = tf.saved_model.loader.load(
        sess_meta,
        [tag_constants.SERVING],
        "/model/path")

    graph_def = meta_graph_def.graph_def

    other_graph_def = TransformGraph(
        graph_def,
        ["Placeholder"],
        ["dnn/head/predictions/probabilities"],
        ["quantize_weights"])


    with tf.Graph().as_default():
        graph = tf.get_default_graph()
        tf.import_graph_def(other_graph_def)
        in_tensor = graph.get_tensor_by_name(
            "import/Placeholder:0")
        out_tensor = graph.get_tensor_by_name(
            "import/dnn/head/predictions/probabilities:0")

        inputs = {"inputs": in_tensor}
        outputs = {"outputs": out_tensor}

        simple_save(sess_meta, "./new", inputs, outputs)

我的想法是加载servable,从meta_graph_def中提取graph_def,转换graph_def,然后尝试重新创建servable . 这似乎是不正确的方法 .

有没有办法从导出的servable成功执行图形转换(减少推理时的文件大小),然后用转换后的图形重新创建一个servable?

谢谢 .

Update (2018-08-28)

找到contrib.meta_graph_transform()看起来很有前途 .

Update (2018-12-03)

一个相关的github issue我打开了一个似乎在一个详细的博客文章中解决,该帖子列在故障单的末尾 .