Python Tensorflow:使用as_default()设置默认会话。\u输入

Python Tensorflow:使用as_default()设置默认会话。\u输入,python,tensorflow,machine-learning,Python,Tensorflow,Machine Learning,我写 为什么我没有实现将x作为默认会话?我知道我可以在“with”块内完成,但我想知道为什么这不起作用 注意,如果我写 import tensorflow as tf x = tf.Session() x.as_default().__enter__() print(tf.get_default_session()) # prints "None" 这是否会创建一个我无法关闭的无名会话,因此它将一直运行,直到我重新启动内核?是否有方法检查当前打开的会话?简单修复: import tensorf

我写

为什么我没有实现将x作为默认会话?我知道我可以在“with”块内完成,但我想知道为什么这不起作用

注意,如果我写

import tensorflow as tf
x = tf.Session()
x.as_default().__enter__()
print(tf.get_default_session()) # prints "None"
这是否会创建一个我无法关闭的无名会话,因此它将一直运行,直到我重新启动内核?是否有方法检查当前打开的会话?

简单修复:

import tensorflow as tf
tf.Session()
结果:

import tensorflow as tf
x = tf.Session().__enter__()
print(tf.get_default_session())

更新

要回答您(最初令人困惑)的后续问题:

使用with语句所做的是进入和退出上下文管理器。这将导致设置和取消设置默认会话。但它并没有打开和关闭您的会话(看起来,这让我很困惑,我只是在一些实验之后才看到它)。请尝试此代码以查看其运行情况:

>>> tf.Session().as_default()
<contextlib._GeneratorContextManager object at 0x7f6820805a58>
>>> tf.Session()
<tensorflow.python.client.session.Session object at 0x7f6820805898>
打印(tf.get\u default\u session()) 没有一个 >>>x=tf.Session() >>>打印(tf.get\u default\u session()) 没有一个 >>>使用x.as_default(): ... 打印(tf.get\u default\u session()) ... >>>打印(x) 在这些语句的末尾,我们看到您的会话从未关闭,但在这一过程中,我们看到默认会话已按预期设置和取消设置

使用标准with语句可以关闭会话和设置/取消设置默认会话

>>> print(tf.get_default_session())
None

>>> x = tf.Session()
>>> print(tf.get_default_session())
None

>>> with x.as_default():
...     print(tf.get_default_session())
... 
<tensorflow.python.client.session.Session object at 0x7f09eb9fb550>
>>> print(x)
<tensorflow.python.client.session.Session object at 0x7f09eb9fb550>
将tf.Session()作为sess的
>>:
...     打印(tf.get\u default\u session())

即使你给tensorflow会话命名,事情也会变得糟糕。如果你不给它命名,tf将不知道它必须在哪个会话下运行哪个操作。@chrisz你能再解释一下吗?比如我把它开得太久?(或者你可以提供一个参考资料)我有点困惑:当我用tf.Session()说
。as_default()
,是不是
\u enter\u()
调用了
tf.Session()。as_default()
返回的东西?是的,但是
tf.Session()。as_default()
返回的东西与
tf.Session()返回的东西不一样
正在返回。我从未使用过
tf.Session().as\u default()
,因此我无法解释
as\u default()
在这里到底做了什么。我只是注意到它没有返回会话。哦,我想我知道它在做什么,
因为_default()。如果您正在运行多个会话,并且希望切换当前全局默认会话,这可能会很有用。谢谢,这很有用。关于
的主题,我在(编辑)问题中提到的两段代码如何做不同的事情?具体地说,当我将
一起使用时,
\uuuu enter\uuu()
是否总是调用
一起返回的东西?谢谢!您已经澄清了这两段代码做不同的事情。我想这意味着我对
的工作原理感到困惑。不使用
with
只需调用
\uu输入
就可以通过
with
返回的内容了吗?它不能,对,因为我写的两段代码做不同的事情。(我说的是
x.as\u default()。\uu输入
,然后我说的是
与x.as\u default()
。顺便说一句,如果我问的后续问题太多,请告诉我
>>> tf.Session().as_default()
<contextlib._GeneratorContextManager object at 0x7f6820805a58>
>>> tf.Session()
<tensorflow.python.client.session.Session object at 0x7f6820805898>
>>> print(tf.get_default_session())
None

>>> x = tf.Session()
>>> print(tf.get_default_session())
None

>>> with x.as_default():
...     print(tf.get_default_session())
... 
<tensorflow.python.client.session.Session object at 0x7f09eb9fb550>
>>> print(x)
<tensorflow.python.client.session.Session object at 0x7f09eb9fb550>
>>> with tf.Session() as sess:
...     print(tf.get_default_session())
<tensorflow.python.client.session.Session object at 0x7f09eb9fbbe0>