计算图的概念
计算图是TensorFlow中最基本的一个概念,TensorFlow中所有的计算都会被转化为计算图上的节点。
TensorFlow----Tensor(体现数据模型)和Flow(体现计算模型) 。Tensor就是张量。张量这个概念在物理和化学中有不同的解释,在本文中张量可以简单的理解为多维数组。Flow则体现了他的计算模型,中文翻译是‘流’,他直观的表达了张量之间通过计算相互转化的过程。TensorFlow是一个通过计算图的形式来表述计算的编程系统。TensorFlow中的每一个计算都是计算图中的一个节点,而节点之间的边描述了计算之间的依赖关系。怎么理解这个依赖关系呢,如果一个运算的输入依赖于另一个运算的输出,那么两个点就存在依赖关系。
a = tf.constant([1.0, 2.0], name="a")
b = tf.constant([2.0, 3.0], name="b")
result = a + b
sess = tf.Session()
print(sess.run(result))
![2c2a585d8ad6a92e1834eb92e738492d.png](https://i-blog.csdnimg.cn/blog_migrate/88f94d3ae2083d17720e03e85932cde0.png)
这是一个简单的向量加法,向量a 和向量b不依赖任何一个其他计算,而 相加(add)这个操作依赖读取两个常量的取值,所以a 和 b 节点有指向add的依赖关系边。而相加之后并没有其他计算需要相加后的结果,所以add没有发出的边。所有TensorFlow的程序都可以用这个计算图形式来表示。
计算图的使用
TensorFlow程序一般可以分为两个阶段,在第一个阶段需要定义计算图中所有的计算,比如在刚才的向量加的例子中首先定义了两个输入,然后定义了一个计算来得到他们的和,第二阶段为执行计算(后边在说)。
在TensorFlow程序中,系统会自动默认一个计算图,通过 tf.get_default_graph 函数获取当前默认的计算图.一下代码示意如何获取默认计算图以及如何查看一个运算所属的计算图。
#通过a . graph 可以查看张-111: 所属的计算圈。因为没有特意指定,所以这个计算图应该等于
#当前默认的计算圈。所以下面这个操作输出值为True 。
print(a . graph is tf . get_default_graph())
除了使用默认的计算图,tensorFlow 支持通过tf.Graph 函数生成新的计算图。不同计算图上的张量和运算都不会共享。下面代码事宜了如何在不同的计算图上定义和使用向量。
import tensorflow as tf
g1 = tf.Graph()
with g1.as_default():
# 在g1计算中定义一个变量v 初始值为 0
v = tf.get_variable("v", initializer=tf.zeros([1], tf.float32))
g2 = tf.Graph()
with g2.as_default():
# 在g2计算中定义一个变量v 初始值为 1
v = tf.get_variable("v", initializer=tf.ones([1], tf.float32))
# 在计算 g1中获取 v的取值
with tf.Session(graph=g1) as sess:
# 全局变量初始化
tf.global_variables_initializer().run()
# 变量范围 reuse 重新使用
with tf.variable_scope("", reuse=True):
# 打印变量g1中的v = [0.]
print(sess.run(tf.get_variable("v")))
with tf.Session(graph=g2) as sess:
tf.global_variables_initializer().run()
with tf.variable_scope("", reuse=True):
#打印g2中的v = [1.]
print(sess.run(tf.get_variable("v")))
以上代码产生了两个计算图,每个计算图中定义一个名字叫“v”的变量。在g1中,将v初始化为0,在g2中,将v初始化为1。在不同的图中运算是这个v的值也不同。TensorFlow中的计算图不仅仅可以隔离张量和计算,他还提供了管理张量和计算机制。计算图可以通过tf.Graph.device 函数来指定运行计算的设备。这为TensorFlow使用GPU提供了机制,一下程序可以将向量加法的运算运行在GPU上。
g= tf.Graph()
with g.device('/gpu:0'):
result = a + b
在一个计算图中,可以通过集合(collection)来管理不同类别的资源。比如通过tf.add_to_collection 函数可以将资源加入一个或多个集合中,tf.get_collection 获取一个集合中的所有资源。这里的资源可以是张量,变量或者运行TensorFlow所需要的队列资源,等等。为了方便使用,TensorFlow也自动管理了一些最常用的集合。
![73c16bc497c10a7e9325fb3f2be281a4.png](https://i-blog.csdnimg.cn/blog_migrate/1002cfe05efe3d316e7021a485e17f45.jpeg)