Python RuntimeError:会话图为空。在调用run()之前向图形添加操作
我正在用keras训练一个神经网络,由于我的数据集非常大,我正在使用Python RuntimeError:会话图为空。在调用run()之前向图形添加操作,python,tensorflow,Python,Tensorflow,我正在用keras训练一个神经网络,由于我的数据集非常大,我正在使用fit_generator将数据输入网络。 作为fit_generator的第一个参数,我必须提供一个生成模型数据补丁的生成器。 我使用tf.data.Dataset创建一个数据集,并使用make\u one\u shot\u迭代器和调用get\u next方法向网络提供数据。 这是密码 def generator(): dataset_iterator = DatasetGenerator(...) # define
fit_generator
将数据输入网络。
作为fit_generator
的第一个参数,我必须提供一个生成模型数据补丁的生成器。
我使用tf.data.Dataset
创建一个数据集,并使用make\u one\u shot\u迭代器
和调用get\u 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\u 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().
我找到了处理它的方法。 我发现在
generator
方法和main方法中(我是说在调用model.fit\u generator
之前)打印tf.get\u default\u 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), ...)
我真的不知道这是不是解决这个问题最优雅的方法。非常感谢进一步的改进:)这是一个急切的执行,如果您想创建一个空会话,请禁用它
将tensorflow导入为tf
tf.compat.v1.disable_eager_execution()
添加next\u batch=dataset\u迭代器。在创建tf.Session()
之前,获取\u next()
行,以便它包含在图形中,并且图形不会变为空。@shubhanchal感谢您的回复。但这没用。同样的错误。这修复了我在多次调用函数时试图保持会话活动的相关问题。但是,如果没有在会话创建之外创建默认图形,它就会崩溃,并显示相同的消息。谢谢你的回答。嗨,欢迎来到StackOverflow。我看到你是一个新的贡献者,所以这里有一个请求:你的答案缺少一些解释,你能编辑它解释为什么禁用急切执行可以解决这个问题吗?为了使它更好,您可以添加一个片段,告知如何执行该操作。