【问题标题】:How to use tf.reset_default_graph()如何使用 tf.reset_default_graph()
【发布时间】:2017-07-04 02:55:32
【问题描述】:

每当我尝试使用tf.reset_default_graph() 时,都会收到此错误:IndexError: list index out of range 或 ``。我应该在代码的哪一部分使用它?我应该什么时候使用它?

编辑:

我更新了代码,但仍然出现错误。

def evaluate():
    with tf.name_scope("loss"):
        global x # x is a tf.placeholder()
        xentropy = tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=neural_network(x))
        loss = tf.reduce_mean(xentropy, name="loss")

    with tf.name_scope("train"):
        optimizer = tf.train.AdamOptimizer()
        training_op = optimizer.minimize(loss)

    with tf.name_scope("exec"):
        with tf.Session() as sess:
            for i in range(1, 2):
                sess.run(tf.global_variables_initializer())
                sess.run(training_op, feed_dict={x: np.array(train_data).reshape([-1, 1]), y: label})
                print "Training " + str(i)
                saver = tf.train.Saver()
                saver.save(sess, "saved_models/testing")
                print "Model Saved."


def predict():
    with tf.name_scope("predict"):
        tf.reset_default_graph()
        with tf.Session() as sess:
            saver = tf.train.import_meta_graph("saved_models/testing.meta")
            saver.restore(sess, "saved_models/testing")
            output_ = tf.get_default_graph().get_tensor_by_name('output_layer:0')
            print sess.run(output_, feed_dict={x: np.array([12003]).reshape([-1, 1])})


def main():
    print "Starting Program..."
    evaluate()
    writer = tf.summary.FileWriter("mygraph/logs", tf.get_default_graph())
    predict()

如果我从更新的代码中删除 tf.reset_default_graph(),我会收到以下错误:ValueError: cannot add op with name hidden_layer1/kernel/Adam as that name is already used

根据我目前的理解,tf.reset_default_graph() 会删除所有图表,因此我避免了上面提到的错误(ValueError: cannot add op with name hidden_layer1/kernel/Adam as that name is already used)

【问题讨论】:

    标签: machine-learning tensorflow


    【解决方案1】:

    这可能是你使用它的方式:

    import tensorflow as tf
    a = tf.constant(1)
    with tf.Session() as sess:
        tf.reset_default_graph()
    

    您收到错误是因为您在会话中使用它。来自tf.reset_default_graph() 文档:

    在 tf.Session 或 tf.InteractiveSession 运行时调用此函数 active 将导致未定义的行为。使用任何以前创建的 调用此函数后的 tf.Operation 或 tf.Tensor 对象将 导致未定义的行为


    tf.reset_default_graph() 在我在 jupyter notebook 中进行实验的测试阶段可能会有所帮助(至少对我而言)。但是,我从未在生产中使用过它,也不知道它在那里会有什么帮助。

    这是一个可以在笔记本中的示例:

    import tensorflow as tf
    # create some graph
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print sess.run(...)
    

    现在我不再需要这些东西了,但是如果我创建另一个图形并在 tensorboard 中将其可视化,我将看到旧节点和新节点。为了解决这个问题,我可以重新启动内核并只运行下一个单元。但是,我可以这样做:

    tf.reset_default_graph()
    # create a new graph
    with tf.Session() as sess:
        print sess.run(...)
    

    在 OP 添加他的代码后编辑

    with tf.name_scope("predict"):
        tf.reset_default_graph()
    

    这是大概发生的情况。您的代码失败,因为 tf.name_scope 已经在图表中添加了一些内容。在“向图表中添加内容”的过程中,您告诉 TF 完全删除图表,但它不能,因为它正忙于添加内容。

    【讨论】:

    • 所以基本上tf.reset_default_graph() 只用于测试而不用于整天运行的应用程序?
    • @CodingNoobie 除了测试和实验之外,我从未出于任何其他原因使用它。不代表不能用,只是没看到有用的地方。
    • 我尝试将它放在正在运行的会话之外,但我仍然遇到同样的错误。我已经用一些代码更新了帖子。希望对您有所帮助。
    • @CodingNoobie 将重置图放在with tf.name_scope("predict"):之前
    • 不错!错误信息消失了。这是为什么?为什么把它移到外面就能解决问题?
    【解决方案2】:

    出于某种原因,我需要多次构建一个新图表,并且我刚刚测试过,它最终可以工作!非常感谢萨尔瓦多·达利的回答:-)

    import tensorflow as tf
    from my_models import Classifier
    
    for i in range(10):
        tf.reset_default_graph()
        # build the graph
        global_step = tf.get_variable('global_step', [], initializer=tf.constant_initializer(0), trainable=False)
        classifier = Classifier(global_step)
        with tf.Session() as sess:
            sess.run(tf.initialize_all_variables())
            print("do sth here.")
    

    【讨论】:

      【解决方案3】:

      随着 TensorFlow 2.0 的发布,现在最好使用tf.compat.v1.reset_default_graph() 以避免收到警告。文档链接:https://www.tensorflow.org/api_docs/python/tf/compat/v1/reset_default_graph

      【讨论】:

        【解决方案4】:

        简单地说, 用于清除您使用 sess.run() 创建的先前占位符

        【讨论】:

        • 请使用评论部分,如果不能,请发布正确的答案!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-29
        • 1970-01-01
        • 1970-01-01
        • 2014-08-19
        相关资源
        最近更新 更多