Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 如何理解sess.as_default()和sess.graph.as_default()?_Tensorflow - Fatal编程技术网

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

Tensorflow 如何理解sess.as_default()和sess.graph.as_default()?,tensorflow,Tensorflow,我读了报纸 注意:默认会话是当前线程的属性。如果创建一个新线程,并希望在该线程中使用默认会话,则必须在该线程的函数中显式添加一个with sess.as_default() 我的理解是,如果在创建新线程时还有两个会话,那么我们必须设置一个会话来在其中运行TensorFlow代码。因此,要做到这一点,需要选择一个会话并调用as_default() 注意:使用sess.as_default()输入a:块不会影响当前默认图形。如果正在使用多个图形,并且sess.graph与tf.get_default

我读了报纸

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

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

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

sess.as\u default()
块中,要调用特定的图,必须调用
sess.graph.as\u default()
来运行图?

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

将tensorflow导入为tf
graph1=tf.Graph()
graph2=tf.Graph()
使用graph1.as_default()作为图形:
a=tf.constant(0,name='a')
graph1_init_op=tf.global_variables_initializer()
使用graph2.as_default()作为图形:
a=tf.constant(1,name='a')
graph2_init_op=tf.global_variables_initializer()
sess1=tf.Session(graph=graph1)
sess2=tf.Session(图=graph2)
sess1.run(graph1_init_op)
sess2.run(graph2_init_op)
#两个张量名称都是一个!
打印(sess1.run(graph1.get_tensor_by_name('a:0'))35;打印0
打印(sess2.run(graph2.get_tensor_by_name('a:0'))35;打印1
使用sess1.as_default()作为sess:
打印(sess.run(sess.graph.get_tensor_by_name('a:0'))35;打印0
使用sess2.as_default()作为sess:
打印(sess.run(sess.graph.get_tensor_by_name('a:0'))35;打印1
使用graph2.as_default()作为g:
使用sess1.as_default()作为sess:
打印(tf.get_default_graph()==graph2)#打印为真
打印(tf.get_default_session()==sess1)#打印为真
#这是一条有趣的线路
打印(sess.run(sess.graph.get_tensor_by_name('a:0'))35;打印0
打印(sess.run(g.get_tensor_by_name('a:0'))#失败
打印(tf.get_default_graph()==graph2)#打印错误
打印(tf.get_default_session()=sess1)#打印错误
运行图形不需要调用
sess.graph.as_default()
,但需要在图形中获得正确的张量或操作才能运行它。上下文允许您使用
tf.get\u default\u graph
tf.get\u default\u session
获取图形或会话

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


在接下来的一行中,它失败了,因为它试图在
graph2
中使用
sess1
运行一个操作。答案非常清楚,我忘记接受你的答案了。抱歉。通常,我们定义一个模型进行训练,另一个模型进行测试/验证(没有一些层,比如Drop)。我们需要显式地分离这两类图吗?在许多例子中,我看不到两个图的用法。但在阅读了您的答案之后,我认为有必要定义两个对应于训练图和测试/有效图的图。我们需要这样做吗?@skytree在tensorflow estimator中,您将看到使用不同模式调用
model\u fn
以获得不同图形的示例。