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

Goi*_*Way 14 tensorflow

我读了sess.as_default()文档

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

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

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

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

jks*_*hin 28

tf.Session API提到的图表在会话启动.以下代码说明了这一点:

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
Run Code Online (Sandbox Code Playgroud)

您无需调用sess.graph.as_default()即可运行图表,但需要在图表中获取正确的张量或操作才能运行图表.上下文允许您使用tf.get_default_graph或获取图形或会话tf.get_default_session.

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

在下面的线,因为它正试图在运行一个操作失败graph2sess1.