如何在预测之间保持张量流会话打开?从SavedModel加载



我训练了一个我想从numpy数组上运行预测的张量模型。这是用于视频中的图像处理。我将在模型发生时将图像传递给模型。并非每个帧都通过。

我在这样的会话中重新加载了我的保存模型,例如

def run(self):                
    with tf.Session(graph=tf.Graph()) as sess:
        tf.saved_model.loader.load(sess,
                    [tf.saved_model.tag_constants.SERVING], "model")

如果我将图像列表(self.tfimages(传递给预测,我的代码可以完美地工作。凝结至:

    softmax_tensor = sess.graph.get_tensor_by_name('final_ops/softmax:0')
    predictions = sess.run(softmax_tensor, {'Placeholder:0': self.tfimages})

,但我不会一次拥有所有图像。我真的必须每次都从文件重新加载模型(需要2分钟以上(。

我想做这样的事情

class tensorflow_model:
def __init__(self):                
    with tf.Session(graph=tf.Graph()) as self.sess:
        tf.saved_model.loader.load(self.sess,
                    [tf.saved_model.tag_constants.SERVING], "model")
def predict(self):
        # Feed the image_data as input to the graph and get first prediction
        softmax_tensor = self.sess.graph.get_tensor_by_name('final_ops/softmax:0')
        predictions = self.sess.run(softmax_tensor, {'Placeholder:0': self.tfimages})

但这会产生

hindins.runtimeerror:尝试使用封闭的会话

是否有一种方法可以保持会话打开,或者也许是Load SavedModel独立于会话?

编辑我尝试了第一个答案,以分为两个步骤创建会话:

sess=tf.Session(graph=tf.Graph())
sess
<tensorflow.python.client.session.Session object at 0x0000021ACBB62EF0>
tf.saved_model.loader.load(sess,[tf.saved_model.tag_constants.SERVING], "model")
Traceback (most recent call last):
  Debug Probe, prompt 138, line 1
  File "C:Program FilesPython35Libsite-packagestensorflowpythonsaved_modelloader_impl.py", line 222, in load
    saver.restore(sess, variables_path)
  File "C:Program FilesPython35Libsite-packagestensorflowpythontrainingsaver.py", line 1428, in restore
    {self.saver_def.filename_tensor_name: save_path})
  File "C:Program FilesPython35Libsite-packagestensorflowpythonclientsession.py", line 774, in run
    run_metadata_ptr)
  File "C:Program FilesPython35Libsite-packagestensorflowpythonclientsession.py", line 905, in _run
    raise RuntimeError('The Session graph is empty.  Add operations to the '
builtins.RuntimeError: The Session graph is empty.  Add operations to the graph before calling run().

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

执行没有错误的执行。

至于将SESS作为班级变量的第二个想法,这是一个很好的想法。这有效:

with tf.Session(graph=tf.Graph()) as sess:
    tf.saved_model.loader.load(sess,[tf.saved_model.tag_constants.SERVING], "model")
    tensorflow_instance=tensorflow(read_from="file")
    tensorflow_instance.predict(sess)

但这不是

sess=tf.Session(graph=tf.Graph())
tf.saved_model.loader.load(sess,[tf.saved_model.tag_constants.SERVING], "model")
tensorflow_instance=tensorflow(read_from="file")
tensorflow_instance.predict(sess)

用AS SESS语句将我的程序包装到

中会很尴尬。

完整代码:

import tensorflow as tf
import sys
from google.protobuf import text_format
from tensorflow.core.framework import graph_pb2
import os
import glob
class tensorflow:    
def __init__(self,read_from):
    #frames to be analyzed
    self.tfimages=[]    
    find_photos=glob.glob("*.jpg")
    # Read in the image_data
    if read_from=="file":
        for x in find_photos:
            image_data = tf.gfile.FastGFile(x, 'rb').read()    
            self.tfimages.append(image_data)
    # Loads label file, strips off carriage return
    self.label_lines = [line.rstrip() for line in tf.gfile.GFile("dict.txt")]
def predict(self,sess):
    # Feed the image_data as input to the graph and get first prediction
    softmax_tensor = sess.graph.get_tensor_by_name('final_ops/softmax:0')
    predictions = sess.run(softmax_tensor, {'Placeholder:0': self.tfimages})
    for prediction in predictions:
        # Sort to show labels of first prediction in order of confidence
        top_k = prediction.argsort()[-len(prediction):][::-1]
        for node_id in top_k:
            human_string = self.label_lines[node_id]
            score = prediction[node_id]
            print('%s (score = %.5f)' % (human_string, score))
        return(human_string)
if __name__ == "__main__":
    with tf.Session(graph=tf.Graph()) as sess:
        tf.saved_model.loader.load(sess,[tf.saved_model.tag_constants.SERVING], "model")
        tensorflow_instance=tensorflow(read_from="file")
        tensorflow_instance.predict(sess)
    sess=tf.Session(graph=tf.Graph())
    tf.saved_model.loader.load(sess,[tf.saved_model.tag_constants.SERVING], "model")
    tensorflow_instance=tensorflow(read_from="file")
    tensorflow_instance.predict(sess)

其他人解释了为什么您不能将会话放在构造函数中的with语句中。

使用上下文管理器与不是因为tf.saved_model.loader.load在默认图和是会话的一部分之间具有一些怪异的交互的原因。

解决方案很简单;如果您不在with块中使用图表:

sess=tf.Session()
tf.saved_model.loader.load(sess,[tf.saved_model.tag_constants.SERVING], "model")

以下是一类用于进行预测的示例代码:

class Model(object):
  def __init__(self, model_path):
    # Note, if you don't want to leak this, you'll want to turn Model into
    # a context manager. In practice, you probably don't have to worry
    # about it.
    self.session = tf.Session()
    tf.saved_model.loader.load(
        self.session,
        [tf.saved_model.tag_constants.SERVING],
        model_path)
    self.softmax_tensor = self.session.graph.get_tensor_by_name('final_ops/softmax:0')
  def predict(self, images):
    predictions = self.session.run(self.softmax, {'Placeholder:0': images})
    # TODO: convert to human-friendly labels
    return predictions

images = [tf.gfile.FastGFile(f, 'rb').read() for f in glob.glob("*.jpg")]
model = Model('model_path')
print(model.predict(images))
# Alternatively (uses less memory, but has lower throughput):
for f in glob.glob("*.jpg"):
  print(model.predict([tf.gfile.FastGFile(f, 'rb').read()]))

您的代码创建一个范围,该范围将在其离开init后退出。

def __init__(self): 
  with tf.Session(graph=tf.Graph()) as self.sess:
    tf.saved_model.loader.load(self.sess[tf.saved_model.tag_constants.SERVING], "model")

如果您的其他所有功能正常。

def __init__(self):   
  self.sess=tf.Session(graph=tf.Graph())
  tf.saved_model.loader.load(self.sess[tf.saved_model.tag_constants.SERVING], "model")

当我做这样的事情时,我通常还会创建一个选项,将会话传递给类参数,然后当我调用类时,我通过 with

在会话中传递会话时

您的代码不起作用,因为在您的初始化功能中,您打开会话并将其关闭。因此,启动完成后没有会话。

如果您想在培训模型后做出许多预测,我建议您不要重新发明轮子并使用该工具,因此创建的TF开发人员出于这个原因:TF Serving。

张量流是一种灵活的高性能服务系统 机器学习模型,专为生产环境而设计。 TensorFlow服务使得部署新算法和 实验,同时保持相同的服务器体系结构和API。 TensorFlow服务提供与TensorFlow的开箱即用集成 模型,但可以轻松扩展到服务其他类型的模型,并且 数据

他们有很多教程从非常基本的教程开始,并花一天的时间在学习几件事上可以节省几个月后。

最新更新