Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TensorFlow:如何从保存的模型进行预测?_Python_Machine Learning_Tensorflow_Tensorflow Serving - Fatal编程技术网

Python TensorFlow:如何从保存的模型进行预测?

Python TensorFlow:如何从保存的模型进行预测?,python,machine-learning,tensorflow,tensorflow-serving,Python,Machine Learning,Tensorflow,Tensorflow Serving,我已经导出了一个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(

我已经导出了一个
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
)执行推理的一个最小示例,以及指定输入和输出节点名称的语法。

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

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)
在这里,您需要知道预测输入的名称。如果您在
服务中没有给他们一个中堂fn
,那么他们默认为
占位符n
,其中
n
是第n个功能


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

假设您希望使用Python进行预测,这可能是加载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)

展示了如何在爪哇、C++和Python中得到预测(尽管事实上问题是集中在估计者身上,答案实际上是独立于如何创建<代码> SaveDead < /COD>)的。

< P>对于需要保存一个经过训练的罐头模型并在没有TunSerFoad服务的情况下服务的例子来说,我在这里有记录

  • 您可以从
    tf.tensorflow.contrib.predictor.from\u saved\u model(exported\u model\u 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_函数中给出的输入名称。 例如:


    tf.estimator.DNNClassifier的构造函数
    有一个名为
    warm\u start\u的参数
    。您可以给它指定
    SavedModel
    文件夹名,它将恢复您的会话。

    可能重复的请参阅我的最新编辑,了解为什么这不是重复的。使用tensorflow 1.7检查详细答案这里显然simple\u save与图形生成代码不兼容,当使用从输入文件读取模型输入时Dataset及其迭代器,因为simple_save需要张量而不是numpy数组。此外,名称空间更改为tf.saved_model,而不是tf.contrib。我的代码可能就是问题所在。使用使用Dataset训练的模型并使用simple_save保存的已知工作代码示例最好有@mrry。显然simple_save的另一个不兼容之处是与输入稀疏numpy数组的图形生成代码不兼容,图形生成代码的第一行是tf.stack,因为它是稀疏矩阵。那么,在图形构建代码之外,您将tf.stack放在哪里呢?使用一个调用tf.stack的模型并使用simple_save保存的已知工作代码示例非常适合@mrry@GeoffreyAnderson听起来值得提出自己的问题;请务必发布您正在使用的代码片段。请注意,这可能不再适用于TensorFlow 2.0。至少,导入可能已更改。文件夹中的
    warm\u start\u包含检查点或
    SavedModel
    ?它们不一样。为什么我们不能向每个占位符传递多个值,比如批处理或输入
    prediction=sess.run('prefix/predictions/Identity:0',feed_dict={'Placeholder:0':[20.9,11.3],'Placeholder_1:0':[1.8,2.6],'Placeholder_2:0':[0.9,0.76])
    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)