Machine learning 如何使用tf.reset\u default\u graph()

Machine learning 如何使用tf.reset\u default\u graph(),machine-learning,tensorflow,Machine Learning,Tensorflow,每当我尝试使用tf.reset\u default\u graph()时,都会出现以下错误:索引器:列表索引超出范围或```。我应该在代码的哪个部分使用这个?我应该什么时候用这个 编辑: 我更新了代码,但错误仍然发生 def evaluate(): 具有tf.name_范围(“损失”): 全局x#x是一个tf.placeholder() xentropy=tf.nn.softmax_交叉_熵_与_logits(标签=y,logits=神经网络(x)) 损失=tf.减少平均值(xentropy,n

每当我尝试使用
tf.reset\u default\u graph()
时,都会出现以下错误:
索引器:列表索引超出范围
或```。我应该在代码的哪个部分使用这个?我应该什么时候用这个

编辑:

我更新了代码,但错误仍然发生

def evaluate():
具有tf.name_范围(“损失”):
全局x#x是一个tf.placeholder()
xentropy=tf.nn.softmax_交叉_熵_与_logits(标签=y,logits=神经网络(x))
损失=tf.减少平均值(xentropy,name=“损失”)
具有tf.name_范围(“列车”):
优化器=tf.train.AdamOptimizer()
培训=优化器。最小化(损失)
使用tf.name_范围(“exec”):
使用tf.Session()作为sess:
对于范围(1,2)内的i:
sess.run(tf.global\u variables\u initializer())
run(training_op,feed_dict={x:np.array(train_数据)。重塑([-1,1]),y:label})
打印“培训”+str(一)
saver=tf.train.saver()
保存(sess,“保存的模型/测试”)
打印“已保存模型”
def predict():
使用tf.name_范围(“预测”):
tf.reset_default_graph()
使用tf.Session()作为sess:
saver=tf.train.import\u元图(“saved\u models/testing.meta”)
saver.restore(sess,“已保存的模型/测试”)
output=tf.get\u default\u graph().get\u tensor\u by\u name('output\u layer:0'))
打印sess.run(输出,提要={x:np.array([12003])。重塑([-1,1]))
def main():
打印“启动程序…”
评估()
writer=tf.summary.FileWriter(“mygraph/logs”,tf.get\u default\u graph())
预测
如果从更新的代码中删除tf.reset\u default\u graph(),则会出现以下错误:
ValueError:无法添加名为hidden\u layer1/kernel/Adam的op,因为该名称已被使用


根据我目前的理解,tf.reset\u default\u graph()会删除所有图形,因此我避免了上面提到的错误(
ValueError:无法添加名为hidden\u layer1/kernel/Adam的op,因为该名称已被使用)

这可能就是您使用它的方式:

import tensorflow as tf
a = tf.constant(1)
with tf.Session() as sess:
    tf.reset_default_graph()
由于在会话中使用错误,因此会出现错误。从
tf.reset\u default\u graph()
文档中:

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


tf.reset\u default\u graph()
在我在jupyter笔记本中进行实验的测试阶段可能会有所帮助(至少对我来说)。然而,我从未在生产中使用过它,也不知道它在那里会有什么帮助

下面是一个可能在笔记本中的示例:

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\u scope
已将某些内容添加到图形中。在“向图形添加内容”的过程中,您告诉TF完全删除图形,但它无法删除,因为它正在忙于添加内容。

出于某种原因,我需要多次构建新图形,我刚刚测试过,最终效果良好!非常感谢萨尔瓦多·达利的回答:-)

简言之,
用于清除在TensorFlow 2.0发布后使用sess.run()创建的先前占位符,现在最好使用
tf.compat.v1.reset\u default\u graph()
,以避免收到警告。链接到文档:

因此基本上
tf.reset\u default\u graph()
只用于测试,而不用于整天运行的应用程序?@CodingNoobie除了测试和实验之外,我从未出于任何其他原因使用过它。这并不意味着它不能被使用,我只是从来没有看到使用它的意义。我尝试将它放置在正在运行的会话之外,但我仍然遇到同样的错误。我已经用一些代码更新了帖子。希望有帮助。@CodingNoobie用tf.name\u scope(“predict”):Nice将重置图放在
前面!错误信息消失了。为什么呢?为什么把它移到外面可以解决问题?请使用评论部分,如果你不能,请发布正确的答案!
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.")