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.
在下面的线,因为它正试图在运行一个操作失败graph2
用sess1
.
归档时间: |
|
查看次数: |
9164 次 |
最近记录: |