不要使用tf.reset_default_graph()来清除嵌套图

时间:2017-10-23 16:07:23

标签: python tensorflow

我有一堆函数,它们创建了计算图的一部分。在一些这样的功能中我做

    with tf.name_scope("my_scope_name"):
        self._eye_n_components = tf.eye(se...

在最顶层的功能开始时,我打电话给

tf.reset_default_graph()

然后调用那些部分功能,他们也可以互相呼叫。

不幸的是,我收到了错误

  

错误:不要使用tf.reset_default_graph()来清除嵌套图。如果   您需要清除图表,退出嵌套并创建新图表。

几个问题。

1)什么是嵌套以及如何"退出嵌套"?

2)如何创建新图表?

3)如何捕捉,我进入筑巢的地方?

4)如何清除整个图形以使tensorflow不认为我试图清除嵌套的图形?

2 个答案:

答案 0 :(得分:19)

在以下某种情况下调用tf.reset_default_graph()时会显示此错误消息:

  • with graph.as_default():区内。
  • with tf.Session():区内。
  • 在创建tf.InteractiveSession和致电sess.close()
  • 之间

这些方案中的每一个都涉及注册默认(可能是"嵌套")tf.Graph对象,当您退出块(或关闭tf.InteractiveSession)时,该对象将被取消注册。在这些情况下重置默认图表会使系统处于不一致状态,因此您应该在调用tf.InteractiveSession之前确保退出阻止(或关闭tf.reset_default_graph())。

答案 1 :(得分:0)

我通过关闭会话并再次加载神经网络模型来解决。

我的答案是:
(1)退出with...块或sess.close()
(2)加载神经网络模型(以及训练的权重),例如:

    gd = tf.GraphDef.FromString(open(checkpoint + '_frozen.pb', 'rb').read())
    inp, predictions = tf.import_graph_def(gd, return_elements=['input:0', 'MobilenetV2/Predictions/Reshape_1:0'])

(3)打印model时,您可能会看到Tensorflow对象<VSR.Backend.TF.Framework.Trainer.VSR object at 0x000001E5DA53C898>
(4)我从here听到了tf.reset_default_graph()tf.keras.backend.clear_session(),但我从未使代码正常工作。