1.请简要介绍下tensorflow的计算图,深度学习 DL框架 中

@寒小阳&AntZ:Tensorflow是一个通过计算图的形式来表述计算的编程系统,计算图也叫数据流图,可以把计算图看做是一种有向图,Tensorflow中的每一个节点都是计算图上的一个Tensor, 也就是张量,而节点之间的边描述了计算之间的依赖关系(定义时)和数学操作(运算时)。Tensorflow计算的过程就是利用的Tensor来建立一个计算图,然后使用Session会话来启动计算,最后得到结果的过程。

无论是编译类型的语言还是脚本语言,都是一步一步的,变量计算后,就会得到结果,比如c=a+b,当执行完语句后,就会得到c的值。但tensorflow不是,它首先要通过编程,构建一个计算图出来,然后启用一个会话来把数据作为输入,通过这个图规定的计算步骤计算,最后得到结果。

tensorflow计算图怎么看 如何理解tensorflow的计算图_数组

计算图的创建

import tensorflow as tf

 if __name__ == "__main__":
     a = tf.constant([1.0,2.0],name = "a")
     b = tf.constant([2.0,3.0],name = "b")
     result = a + b
 print(a.graph)
 print(a.graph is tf.get_default_graph())

 g1 = tf.Graph()
 with g1.as_default():
     c = tf.get_variable("c",initializer = tf.zeros_initializer,shape=(1))
     
 g2 = tf.Graph()
 with g2.as_default():
     c = tf.get_variable("c",initializer = tf.ones_initializer,shape=(1))

 with tf.Session(graph=g1) as sess:
     tf.initialize_all_variables().run()
     with tf.variable_scope("",reuse = True):
         print(sess.run(tf.get_variable("c")))
         
 with tf.Session(graph=g2) as sess:
     tf.initialize_all_variables().run()
     with tf.variable_scope("",reuse = True):
         print(sess.run(tf.get_variable("c")))

结果:

<tensorflow.python.framework.ops.Graph object at 0x7f972806de50>
 True
 WARNING:tensorflow:From /home/lee/anaconda2/lib/python2.7/site-packages/tensorflow/python/util/tf_should_use.py:175: initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02.
 Instructions for updating:
 Use `tf.global_variables_initializer` instead.
 [ 0.]
 WARNING:tensorflow:From /home/lee/anaconda2/lib/python2.7/site-packages/tensorflow/python/util/tf_should_use.py:175: initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02.
 Instructions for updating:
 Use `tf.global_variables_initializer` instead.
 [ 1.]

分别在计算图g1和g2中都定义张量c,在g1中初始化为0,在g2中初始化为1,从上面的代码可以看出,当我们运行不同的计算图的时候张量c的值是不一样的。所以,在TensorFlow中可以通过计算图来隔离张量的运算

张量:

import tensorflow as tf  
 import numpy as np   
 if __name__ == "__main__":  
     a = tf.constant([1.0,2.0],name="a")  
     b = tf.constant([2.0,3.0],name="b")  
     result = tf.add(a,b,name="add")  
     print(result)  
     # Tensor("add:0", shape=(2,), dtype=float32)  
     np_a = np.array([1.0,2.0])  
     np_b = np.array([2.0,3.0])  
     np_result = np_a + np_b  
     print(np_result)  
     # [ 3.  5.]

在TensorFlow中,可以将张量理解为数组。如果是0阶张量,那么将代表这个张量是一个标量,也就是一个数字,如果是一阶张量可以理解为向量或者是一维数组,n阶张量可以理解为n维的数组。但,TensorFlow张量的实现并没有直接采用数组的形式,张量它只是对运算结果的引用,从下面的例子中可以发现,TensorFlow的张量和numpy的数组是不一样的,TensorFlow的计算结果不是一个数组而是一个张量的结构形式,在这个张量中,它包含了三个重要的属性,名字、维度、类型。

张量的名字,是张量的唯一标识符,通过名字可以发现张量是如何计算出来的。计算图中的每一个节点都代表了一个计算,而计算的结果就保存在张量之中,张量和计算图上的节点所代表的计算结果是对应的。“add:0”代表的是计算节点"add"的第一个输出结果(编号都是从0开始)。

张量的维度,说明了张量的维度信息,如shape=(2,)代表张量是一个二维数组。

张量的类型,说明了张量的数据类型,每一个张量都会有一个对应的数据类型。在TensorFlow的计算中,先会对参与运算的所有张量进行类型检测,如果发现张量的类型不匹配的时候就会报错。


会话:

会话:用来执行定义好的运算,而且会话拥有和管理程序运行时的所有资源。当计算完成之后,需要通过关闭会话来帮助系统回收资源,否则可能导致资源泄露的问题。在TensorFlow中使用会话有两种方式。第一种需要明确调用会话生成函数和关闭会话函数

a = tf.constant([1.,2.],name="a")  
 b = tf.constant([2.0,3.0],name="b")  
 result = tf.add(a,b,name="add")  
 # 创建session  
 sess = tf.Session()  
 #获取运算结果  
 sess.run(result)  
 #关闭会话,释放资源  
 sess.close()

在使用这种模式的时候,需要明确的调用sess.close()来关闭会话释放资源。如果,当程序因为异常而退出的时候,sess.close()有可能不会执行从而导致资源泄露问题的发生。为了解决这种情况,TensorFlow提供了通过python的上下文管理器来使用会话,也就是第二种方式

#通过python的上下文管理器来创建Session,管理会话  
 #通过上下文管理来管理会话,不需要调用sess.close()来关闭会话  
 #当上下文退出的时候会话会自动关闭和释放资源  
 with tf.Session() as sess:  
     sess.run(result)