tensorflow自定义估算器的预测和export_outputs有什么区别?如何使用?

时间:2018-08-24 02:38:51

标签: tensorflow tensorflow-serving

我想保存我的张量流模型并在以后还原以进行预测,然后使用估计器的export_savedmodel保存该模型。

对于文档,我使用serving_input_receiver_fn来指定输入。我也想使用export_outputs来指定输出,但是我不理解预测和export_outputs之间的区别?

if mode == tf.estimator.ModeKeys.PREDICT:
    export_outputs = {
        'predict_output': tf.estimator.export.PredictOutput({
            'class_ids': predicted_classes[:, tf.newaxis],
            'probabilities': tf.nn.softmax(logits),
            'logits': logits
        })
    }
    predictions = {
        'class': predicted_classes[:, tf.newaxis],
        'prob': tf.nn.softmax(logits),
        'logits': logits,
    }
    return tf.estimator.EstimatorSpec(mode, predictions=predictions, export_outputs=export_outputs)

另一个问题是如何使用保存的pb模型在会话中进行预测?

with tf.Session(graph=tf.Graph()) as sess:
    model_path = 'model/1535016490'
    tf.saved_model.loader.load(sess, [tf.saved_model.tag_constants.SERVING], model_path)
    inputs = sess.graph.get_tensor_by_name('input_example:0')
    # how to get the output tensor?
    # outputs = sess.graph.get_tensor_by_name()
    res = sess.run([outputs], feed_dict={inputs: examples})

我可以使用tensorflow.contrib.predictor来获得一些结果,但是我希望我们团队的通用方法将使用C ++恢复模型。所以我认为获取张量并在会话中运行它们也许是我想要的方法?

from tensorflow.contrib import predictor

predict_fn = predictor.from_saved_model(
    export_dir='model/1535012949',
    signature_def_key='predict_output',
    tags=tf.saved_model.tag_constants.SERVING
)

predictions = predict_fn({'examples': examples})

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

对于第一个问题,我不是100%肯定的,但是我相信在tf.session()中调用estimator.predict(...)时会使用预测,而在服务期间会使用export_outputs。我的意思是,如果您有一个docker tensorflow / serving或其他正在运行并加载了已保存模型的服务器,并使用输入进行查询,则响应将基于您的export_outputs定义。

对不起,我对您的第二个问题不清楚。在这一点上,保存张量流模型的方法有很多,这很难说。我想看一下save and restore的官方文档,并根据您如何保存模型以及是否使用估算器来找到建议的还原方法。

此外,在#tensorflow的首页上的此question可能会有用。

祝你好运~~

答案 1 :(得分:0)

对于那些登陆这里以寻找有关export_outputs和预测的信息的人,请确保也检查this question