TensorFlow编程与C、C++、JAVA等高级程序设计语言有很大的不同。在高级程序设计语言中,都是一步一步计算的,每计算完一步就可以得到一个执行结果。在TensorFlow中,首先需要构建一个计算图,然后按照计算图启动一个会话,在会话中完成变量赋值,计算,得到最终结果等操作。因此,可以说TensorFlow是一个按照计算图设计的逻辑进行计算的编程系统。可以把这个计算图看作是一个有向图,每一个计算都可以看作图中的一个节点,节点之间的边反映了节点之间的依赖关系。
TensorFlow的计算图可以分为两个部分:(1)构造部分,包含计算流图;(2)执行部分,通过session执行图中的计算。
构造部分又分为两部分:(1)创建源节点;(2)源节点输出传递给其他节点做运算。
TensorFlow默认图:TensorFlow python库中有一个默认图(default graph)。节点构造器(op构造器)可以增加节点。
在TensorFlow中,系统会维护一个默认的计算图,可以通过tf.get_default_graph()获取。
向默认的计算图中添加一个操作,可以使用下面的方式:
c = tf.constant(3.0)
assert c.graph == tf.get_default_graph()
不使用默认的计算图编程方式如下:
g = tf.Graph()
with g.as_default():
c = tf.constant(3.0)
assert c.graph is g
#coding:utf-8
import tensorflow as tf
g1 = tf.Graph()
with g1.as_default():
# 在图g1中定义初始变量v, 并设置初始值为0
v = tf.get_variable("v", shape=[1], initializer = tf.zeros_initializer(dtype=tf.float32))
g2 = tf.Graph()
with g2.as_default():
# 在图g1中定义初始变量v, 并设置初始值为1
v = tf.get_variable("v", shape=[1], initializer = tf.ones_initializer(dtype=tf.float32))
with tf.Session(graph=g1) as sess:
sess.run(tf.global_variables_initializer())
with tf.variable_scope('', reuse=True):
# 输出值为0
print sess.run(tf.get_variable("v"))
with tf.Session(graph=g2) as sess:
sess.run(tf.global_variables_initializer())
with tf.variable_scope('', reuse=True):
# 输出值为1
print sess.run(tf.get_variable('v'))
上面的程序分别创建了计算图,并采用了with代码块的方式访问数据和关闭session,运行不同的计算图的时候,得到的v的值是不一样的。
还可以指定计算图运行在哪个设备上,具体代码如下:
g = tf.Graph()
# 指定计算运行的设备
with g.device('/gpu:0'):
result = a + b
其实,最直观的方式就是把TensorFlow的计算图想象成神经网络结构,在这个结构中每一个节点可以看作操作(op),每个节点的连线就相当于与这个节点的输入,这个节点的输出的直接连线作为下一个直接相连的节点的输入。当计算图构造完成之后,还不能直接得到每个节点的值,必须启动session之后才能得到。
参考文献:
(1)TensorFlow计算模型-----计算图。点击打开链接
(2)关于TensorFlow计算图与tensor的理解。点击打开链接
(3)TensorFlow入门(三)----TensorFlow的计算图和tensor。点击打开链接