繁体   English   中英

TensorFlow:如何从SavedModel进行预测?

[英]TensorFlow: How to predict from a SavedModel?

我已经导出了SavedModel ,现在可以将其加载回并进行预测。 经过培训,具有以下功能和标签:

F1 : FLOAT32
F2 : FLOAT32
F3 : FLOAT32
L1 : FLOAT32

所以说,我想在值养活20.9, 1.8, 0.9得到一个FLOAT32预测。 我该如何完成? 我已经成功地加载了模型,但是我不确定如何访问它以进行预测调用。

with tf.Session(graph=tf.Graph()) as sess:
    tf.saved_model.loader.load(
        sess,
        [tf.saved_model.tag_constants.SERVING],
        "/job/export/Servo/1503723455"
    )

    # How can I predict from here?
    # I want to do something like prediction = model.predict([20.9, 1.8, 0.9])

该问题不是此处发布的问题的重复。 这个问题集中于在任何模型类的SavedModel上进行推理的最小示例(不仅限于tf.estimator )以及指定输入和输出节点名称的语法。

假设您要使用Python进行预测, SavedModelPredictor可能是加载SavedModel并获取预测的最简单方法。 假设您像这样保存模型:

# Build the graph
f1 = tf.placeholder(shape=[], dtype=tf.float32)
f2 = tf.placeholder(shape=[], dtype=tf.float32)
f3 = tf.placeholder(shape=[], dtype=tf.float32)
l1 = tf.placeholder(shape=[], dtype=tf.float32)
output = build_graph(f1, f2, f3, l1)

# Save the model
inputs = {'F1': f1, 'F2': f2, 'F3': f3, 'L1': l1}
outputs = {'output': output_tensor}
tf.contrib.simple_save(sess, export_dir, inputs, outputs)

(输入可以是任何形状,甚至不必是图形中的占位符或根节点)。

然后,在将使用SavedModel的Python程序中,我们可以得到如下预测:

from tensorflow.contrib import predictor

predict_fn = predictor.from_saved_model(export_dir)
predictions = predict_fn(
    {"F1": 1.0, "F2": 2.0, "F3": 3.0, "L1": 4.0})
print(predictions)

该答案显示了如何在Java,C ++和Python中获得预测(尽管问题集中在Estimators上,但该答案实际上独立于SavedModel的创建方式而适用)。

对于需要保存训练好的罐装模型并在没有tensorflow服务的情况下提供服务的工作示例的人,我已在此处记录了https://github.com/tettusud/tensorflow-examples/tree/master/estimators

  1. 您可以从tf.tensorflow.contrib.predictor.from_saved_model( exported_model_path)创建一个预测变量
  2. 准备输入

     tf.train.Example( features= tf.train.Features( feature={ 'x': tf.train.Feature( float_list=tf.train.FloatList(value=[6.4, 3.2, 4.5, 1.5]) ) } ) ) 

x是导出时在input_receiver_function中给出的输入名称。 例如:

feature_spec = {'x': tf.FixedLenFeature([4],tf.float32)}

def serving_input_receiver_fn():
    serialized_tf_example = tf.placeholder(dtype=tf.string,
                                           shape=[None],
                                           name='input_tensors')
    receiver_tensors = {'inputs': serialized_tf_example}
    features = tf.parse_example(serialized_tf_example, feature_spec)
    return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)

加载图形后,它在当前上下文中可用,您可以通过它馈入输入数据以获得预测。 每个用例都有很大的不同,但是在代码中添加的内容如下所示:

with tf.Session(graph=tf.Graph()) as sess:
    tf.saved_model.loader.load(
        sess,
        [tf.saved_model.tag_constants.SERVING],
        "/job/export/Servo/1503723455"
    )

    prediction = sess.run(
        'prefix/predictions/Identity:0',
        feed_dict={
            'Placeholder:0': [20.9],
            'Placeholder_1:0': [1.8],
            'Placeholder_2:0': [0.9]
        }
    )

    print(prediction)

在这里,您需要知道预测输入将是什么的名称。 如果您没有在serving_fn中给他们一个中殿,那么它们默认为Placeholder_n ,其中n是第n个特征。

sess.run的第一个字符串参数是预测目标的名称。 这将根据您的用例而有所不同。

tf.estimator.DNNClassifier的构造tf.estimator.DNNClassifier具有一个称为warm_start_from的参数。 您可以为其指定SavedModel文件夹名称,它将恢复您的会话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM