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])
此问题与 发布的问题不重复。这个问题侧重于对任何模型 class(不仅限于 tf.estimator
)的 SavedModel
执行推理的最小示例,以及指定输入和输出节点名称的语法。
加载图形后,它在当前上下文中可用,您可以通过它提供输入数据以获得预测。每个用例都相当不同,但是添加到您的代码中的内容将如下所示:
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
的第一个字符串参数是预测目标的名称。这将根据您的用例而有所不同。
假设您想要 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 中进行预测(尽管 问题 的重点是估算器,答案实际上独立于 SavedModel
的创建方式)。
对于需要保存经过训练的罐装模型并在没有 tensorflow 服务的情况下提供服务的工作示例的任何人,我已在此处记录
https://github.com/tettusud/tensorflow-examples/tree/master/estimators
- 您可以根据
tf.tensorflow.contrib.predictor.from_saved_model( exported_model_path)
创建预测器
准备输入
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)
tf.estimator.DNNClassifier
的构造函数有一个名为 warm_start_from
的参数。您可以为其指定 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])
此问题与 tf.estimator
)的 SavedModel
执行推理的最小示例,以及指定输入和输出节点名称的语法。
加载图形后,它在当前上下文中可用,您可以通过它提供输入数据以获得预测。每个用例都相当不同,但是添加到您的代码中的内容将如下所示:
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
的第一个字符串参数是预测目标的名称。这将根据您的用例而有所不同。
假设您想要 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)
SavedModel
的创建方式)。
对于需要保存经过训练的罐装模型并在没有 tensorflow 服务的情况下提供服务的工作示例的任何人,我已在此处记录 https://github.com/tettusud/tensorflow-examples/tree/master/estimators
- 您可以根据
tf.tensorflow.contrib.predictor.from_saved_model( exported_model_path)
创建预测器
准备输入
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)
tf.estimator.DNNClassifier
的构造函数有一个名为 warm_start_from
的参数。您可以为其指定 SavedModel
文件夹名称,它将恢复您的会话。