我读了默认()
注意:默认会话是当前线程的属性。如果您创建一个新线程,并希望在该线程中使用默认会话,则必须在该线程的函数中显式添加一个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()来运行图形?
发布于 2017-07-14 05:28:06
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您不需要调用sess.graph.as_default()来运行图形,但是您需要在图中获得正确的张量或操作才能运行它。上下文允许您使用tf.get_default_graph或tf.get_default_session获取图形或会话。
在上面有趣的行中,默认会话是sess1,它隐式地调用sess1.graph,这是sess1中的图,即graph1,因此它打印0。
在后面的行中,它失败了,因为它试图在graph2中使用sess1运行一个操作。
https://stackoverflow.com/questions/45093688
复制相似问题