tensorflow下的Graph中 tf.Operation是一个node,而tf.Tensor是一个edge
以tf.constant(0.0)为例,调用tf.constant(0.0)创建一个单独的tf.Operation,生成值42.0,将其添加到默认图形,并返回一个表示常数的值的tf.Tensor
在没有特别说明的情况下,程序中定义的tf.Operation均是添加进入default_graph中。若使用
graph1=tf.Graph() # 声明tf.Graph()的一个类实例,即获取一个graph
with graph1.as_default():
#完成graph1这个计算图中的tf.Operation的定义,即将在这个with所调用的上下文管理器中定义的tf.Operation添加进入声明的tf.Graph实例graph1中
pass
其实这种方式本质上也是将graph设置为default_graph,所以可以认为,所有的tf.Operation均是添加到default_graph进行的,而这个default_graph是可以设置的。
再说说这个with graph1.as_default():
with会启动一个上下文管理器。所谓上下文管理器,就是在程序执行前将上文中当前所需要的资源准备好,并在结束时被系统回收。
with graph1.as_default()的含义是在这个with启动的上下文管理器中将graph1设置为default_graph,在with启动的上下文管理器内部所定义的tf.Operation则会添加进入当前的default_graph中,也就是graph1中。在整个with代码块结束后,default_graph将会重新设置为之前的,属于全局的graph。
从下面的代码可以对以上说法进行验证:
# -*- coding:utf-8 -*-
import tensorflow as tf
v1 = tf.Variable([0.0], name='v1')
v2 = tf.constant([1.0], name='v2')
add = tf.add(v1,v2, name='add')
graph1 = tf.Graph()
with graph1.as_default():
v4 = tf.Variable([3.0], name='v4')
with tf.Session() as sess1:
sess1.run(tf.global_variables_initializer())
print sess1.run(add)
with tf.Session(graph=tf.get_default_graph()) as sess2:
sess2.run(tf.global_variables_initializer())
print sess2.run(v1)
g_op = graph1.get_operations()
print 'the operations in graph1>>> \n', g_op
print '\n'
d_op = tf.get_default_graph().get_operations()
print 'the operations in default graph>>> \n',d_op
输出结果如下:
[ 1.]
[ 0.]
the operations in graph1>>>
[<tf.Operation 'v4/initial_value' type=Const>, <tf.Operation 'v4' type=VariableV2>, <tf.Operation 'v4/Assign' type=Assign>, <tf.Operation 'v4/read' type=Identity>]
the operations in default graph>>>
[<tf.Operation 'v1/initial_value' type=Const>, <tf.Operation 'v1' type=VariableV2>, <tf.Operation 'v1/Assign' type=Assign>, <tf.Operation 'v1/read' type=Identity>, <tf.Operation 'v2' type=Const>, <tf.Operation 'add' type=Add>, <tf.Operation 'init' type=NoOp>, <tf.Operation 'init_1' type=NoOp>]
由此就可以知道graph1和default_graph中的tf.Operation有哪些了。