前一段时间在学Keras,对深度学习算是有了点了解。最近在学Tensorflow,感觉有些重要的概念需要记录下来,方便日后复习查看。
首先来看下什么是计算图
Tensorflow 程序中的计算过程可以表示为一个计算图,其作用与外观都可以类比程序流程图来理解,在计算图上我们可以直观地看到数据的计算流程。
计算图中每一个运算都可以视为一个节点(Node),每一个节点都可有任意个输入和输出。
如果一个运算的输入取值自另一个运算的输出,那么称这两个运算存在依赖关系,并且这两个运算的节点之间通过边相互连接。
通常将Tensorflow的计算图称为程序的“计算模型”,编写Tensorflow程序时,系统会自动维护一个默认的计算图,Tensorflow会自动将定义的所有计算添加到默认的计算图中。在Tensorflow程序中,通过函数get_default_graph()可以获取对当前默认计算图的引用。
一般情况下我们使用默认的计算图可以满足绝大部分情况下的需求,当我们需要更多的计算图来完成工作的时候,可以通过函数Graph()来生成新的计算图,而且可以通过函数as_default()将新的计算图设置成默认的计算图。
我们来看一个例子
import tensorflow as tf
g1=tf.Graph()
with g1.as_default():
a=tf.get_variable("a",[2],initializer=tf.ones_initializer())
b=tf.get_variable("b",[2],initializer=tf.zeros_initializer())
g2=tf.Graph()
with g2.as_default():
a=tf.get_variable("a",[2],initializer=tf.zeros_initializer())
b=tf.get_variable("b",[2],initializer=tf.ones_initializer())
with tf.Session(graph=g1) as sees:
tf.global_variables_initializer().run()
with tf.variable_scope("",reuse=True):
print(sees.run(tf.getvariable("a")))
print(sees.run(tf.getvariable("b")))
#这里输出[1,1]
# [0,0]
with tf.Session(graph=g2) as sees:
tf.global_variables_initializer().run()
with tf.variable_scope("",reuse=True):
print(sees.run(tf.getvariable("a")))
print(sees.run(tf.getvariable("b")))
#这里输出[0,0]
# [1,1]
可以看到,代码中使用了函数Graph()生成了两个计算图以及使用as_default()函数将生成的计算图设定为默认图,在计算图g1中,a是一个1x2维的矩阵[1,1],b是一个1x2维的矩阵[0,0],而在计算图g2中,a是一个1x2维的矩阵[0,0],b是一个1x2维的矩阵[1,1]。
由此,我们不难得出一个结论,名字相同的张量在不同的计算图中的值是不一样的,而且两个张量之间是互不干扰的。另外,不同的计算图上的张量和运算都不会共享的,也就是说,我们不能在某一计算图中调用其它计算图中的成员。
参考书籍:《TensorFlow深度学习算法原理与编程实战》 蒋子阳 著