首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解sess.as_default()和sess.graph.as_default()?

如何理解sess.as_default()和sess.graph.as_default()?
EN

Stack Overflow用户
提问于 2017-07-14 02:31:09
回答 1查看 14.7K关注 0票数 14

我读了默认()

注意:默认会话是当前线程的属性。如果您创建一个新线程,并希望在该线程中使用默认会话,则必须在该线程的函数中显式添加一个with ():。

我的理解是,如果在创建新线程时还有两个会话,我们必须设置一个会话来在其中运行TensorFlow代码。因此,要做到这一点,选择一个会话并调用as_default()

注意:使用sess.as_default():块输入一个不影响当前默认图。如果使用多个图形,而且sess.graph与tf.get_default_graph的值不同,则必须显式地输入with sess.graph.as_default():块,以使sess.graph成为默认图。

sess.as_default()块中,要调用特定的图,必须调用sess.graph.as_default()来运行图形?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-14 05:28:06

tf.Session API提到在会话中启动了一个图形。以下代码说明了这一点:

代码语言:javascript
复制
import tensorflow as tf

graph1 = tf.Graph()
graph2 = tf.Graph()

with graph1.as_default() as graph:
  a = tf.constant(0, name='a')
  graph1_init_op = tf.global_variables_initializer()

with graph2.as_default() as graph:
  a = tf.constant(1, name='a')
  graph2_init_op = tf.global_variables_initializer()

sess1 = tf.Session(graph=graph1)
sess2 = tf.Session(graph=graph2)
sess1.run(graph1_init_op)
sess2.run(graph2_init_op)

# Both tensor names are a!
print(sess1.run(graph1.get_tensor_by_name('a:0'))) # prints 0
print(sess2.run(graph2.get_tensor_by_name('a:0'))) # prints 1

with sess1.as_default() as sess:
  print(sess.run(sess.graph.get_tensor_by_name('a:0'))) # prints 0

with sess2.as_default() as sess:
  print(sess.run(sess.graph.get_tensor_by_name('a:0'))) # prints 1

with graph2.as_default() as g:
  with sess1.as_default() as sess:
    print(tf.get_default_graph() == graph2) # prints True
    print(tf.get_default_session() == sess1) # prints True

    # This is the interesting line
    print(sess.run(sess.graph.get_tensor_by_name('a:0'))) # prints 0
    print(sess.run(g.get_tensor_by_name('a:0'))) # fails

print(tf.get_default_graph() == graph2) # prints False
print(tf.get_default_session() == sess1) # prints False

您不需要调用sess.graph.as_default()来运行图形,但是您需要在图中获得正确的张量或操作才能运行它。上下文允许您使用tf.get_default_graphtf.get_default_session获取图形或会话。

在上面有趣的行中,默认会话是sess1,它隐式地调用sess1.graph,这是sess1中的图,即graph1,因此它打印0。

在后面的行中,它失败了,因为它试图在graph2中使用sess1运行一个操作。

票数 30
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45093688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档