Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python RuntimeError:会话图为空。在调用run()之前向图形添加操作_Python_Tensorflow - Fatal编程技术网

Python RuntimeError:会话图为空。在调用run()之前向图形添加操作

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

我正在用keras训练一个神经网络,由于我的数据集非常大,我正在使用
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。我看到你是一个新的贡献者,所以这里有一个请求:你的答案缺少一些解释,你能编辑它解释为什么禁用急切执行可以解决这个问题吗?为了使它更好,您可以添加一个片段,告知如何执行该操作。