Eri*_*uld 3 python machine-learning tensorflow
我写
import tensorflow as tf
x = tf.Session()
x.as_default().__enter__()
print(tf.get_default_session()) # prints "None"
Run Code Online (Sandbox Code Playgroud)
为什么我没有完成让x成为默认会话的任务?我知道我可以在“ with”块中执行此操作,但是我想知道为什么这不起作用。
请注意,如果我写
import tensorflow as tf
with tf.Session().as_default():
print(tf.get_default_session()) # shows <tensorflow.python.client.session.Session object at 0x114217a90>
Run Code Online (Sandbox Code Playgroud)
这两段代码如何做不同的事情?
另外,如果我只是写
import tensorflow as tf
tf.Session()
Run Code Online (Sandbox Code Playgroud)
那会不会创建一个我无法关闭的无名会话,所以它将一直运行直到重启内核?有没有办法检查当前打开的会话?
简单修复:
import tensorflow as tf
x = tf.Session().__enter__()
print(tf.get_default_session())
Run Code Online (Sandbox Code Playgroud)
结果:
<tensorflow.python.client.session.Session object at 0x7f6855cbafd0>
Run Code Online (Sandbox Code Playgroud)
原因:
as_default()返回上下文管理器,而不是会话,是_GeneratorContextManager在您要输入对象时在对象上调用enter Session。
>>> tf.Session().as_default()
<contextlib._GeneratorContextManager object at 0x7f6820805a58>
>>> tf.Session()
<tensorflow.python.client.session.Session object at 0x7f6820805898>
Run Code Online (Sandbox Code Playgroud)
更新资料
要回答您的(最初感到困惑)后续问题:
使用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>
Run Code Online (Sandbox Code Playgroud)
在这些语句的结尾,我们看到您的会话从未关闭,但是在此过程中,我们看到默认会话已按预期设置和未设置。
使用标准with语句既可以关闭会话,也可以设置/取消默认会话。
>>> with tf.Session() as sess:
... print(tf.get_default_session())
<tensorflow.python.client.session.Session object at 0x7f09eb9fbbe0>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3143 次 |
| 最近记录: |