【问题标题】:RuntimeError: The Session graph is empty. Add operations to the graph before calling run()RuntimeError:会话图为空。在调用 run() 之前向图中添加操作
【发布时间】:2020-04-01 00:27:26
【问题描述】:

我正在使用 keras 训练神经网络,由于我的数据集非常大,我使用 fit_generator 将数据提供给网络。 作为fit_generator 的第一个参数,我必须提供一个生成器来为我的模型生成数据块。 我使用tf.data.Dataset 来制作数据集并使用make_one_shot_iterator 和调用get_next 方法为网络提供数据。 这是代码

def generator():
    dataset_iterator = DatasetGenerator(...)  # defined class to returns a tf iterator
    with tf.Session() as sess:
        next_batch = dataset_iterator.get_next()

        while True:
            img, label = sess.run(next_batch)
            # some process on label
            yield img, label


# down in the code for training:
model.fit_generator(generator=generator(), ...)

这工作得很好。 当我尝试将dataset_iterator 作为generator 方法的参数发送时,问题就开始了,如下所示:

def generator(dataset_iterator):
    with tf.Session() as sess:
        next_batch = dataset_iterator.get_next()

        while True:
            img, label = sess.run(next_batch)
            # some process on label
            yield img, label


# down in the code for training:
dataset_iterator = DatasetGenerator(...)
model.fit_generator(generator=generator(dataset_iterator), ...)

现在,我收到以下错误:

RuntimeError: The Session graph is empty.  Add operations to the graph before calling run().

【问题讨论】:

  • 在创建tf.Session() 之前添加next_batch = dataset_iterator.get_next() 行,使其包含在图表中并且图表不会为空。
  • @ShubhamPanchal 感谢您的回复。但它没有帮助。同样的错误。

标签: python tensorflow


【解决方案1】:

我找到了处理它的方法。 我发现在generator 方法和main 方法中(我的意思是在调用model.fit_generator 之前)打印tf.get_default_graph() 会返回不同的图表。

为什么?我不知道!

无论如何,我通过将默认图形作为另一个参数发送给函数并将其引入tf.Session() 来解决它。像这样:

def generator(dataset_iterator, default_graph):
    with tf.Session(graph=default_graph) as sess:
        next_batch = dataset_iterator.get_next()

        while True:
            img, label = sess.run(next_batch)
            # some process on label
            yield img, label


# down in the code for training:
dataset_iterator = DatasetGenerator(...)
default_graph = tf.get_default_graph()
model.fit_generator(generator=generator(dataset_iterator, default_graph), ...)

我实际上不知道这是否是解决问题的最优雅的方法。非常感谢进一步的改进:)

【讨论】:

  • 这解决了一个相关问题,我试图在函数的多次调用中保持会话处于活动状态。但是如果没有在会话创建之外创建默认图表,它会因相同的消息而崩溃。谢谢你的回答。
【解决方案2】:

它是急切执行,如果你想创建一个空会话,请禁用它。

import tensorflow as tf
tf.compat.v1.disable_eager_execution()

【讨论】:

  • 嗨,欢迎来到 StackOverflow。我看到你是一个新的贡献者,所以这里有一个请求:你的答案缺乏一些解释,你能编辑它解释为什么禁用急切执行可以解决问题吗?为了做得更好,你可以添加一个 sn-p 来告诉你怎么做。
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多