重新加载张量流模型

Vla*_*oiu 1 tensorflow

我有两个独立的tensorflow进程,一个是训练模型并写出graph_def tensorflow.python.client.graph_util.convert_variables_to_constants,另一个是读取graph_def tensorflow.import_graph_def.我希望第二个进程在第一个进程更新时定期重新加载graph_def.不幸的是,即使我关闭当前会话并创建一个新会话,似乎每次我读取graph_def仍会使用旧的.我也曾尝试包裹import_graph_def callsess.graph.as_default(),但没有成功.这是我当前的graph_def加载代码:

if self.sess is not None:
    self.sess.close()
self.sess = tf.Session()

graph_def = tf.GraphDef()
with open(self.graph_path, 'rb') as f:
    graph_def.ParseFromString(f.read())
with self.sess.graph.as_default():
    tf.import_graph_def(graph_def, name='')
Run Code Online (Sandbox Code Playgroud)

mrr*_*rry 5

这里的问题是,当你创建一个tf.Session没有参数的时候,它会使用当前的默认图形.假设您没有tf.Graph在代码中的任何其他位置创建,则会获得在进程启动时创建的全局默认图,并在所有会话之间共享.结果,with self.sess.graph.as_default():没有效果.

很难从你在问题中展示的片段中推荐一个新的结构 - 特别是,我不知道你是如何创建上一个图形的,或者类结构是什么 - 但是有一种可能性就是self.sess = tf.Session()用下面的代替:

self.sess = tf.Session(graph=tf.Graph())  # Creates a new graph for the session.
Run Code Online (Sandbox Code Playgroud)

现在,with self.sess.graph.as_default():将使用为会话创建的图形,您的程序应该具有预期的效果.

一个稍微偏好(至少对我而言)的替代方案是明确地构建图形:

with tf.Graph().as_default() as imported_graph:
    tf.import_graph_def(graph_def, ...)

sess = tf.Session(graph=imported_graph)
Run Code Online (Sandbox Code Playgroud)