【转载】TensorFlow_数据流图

最近在学习tensorflow的使用,结果第一章的数据流图就有些云里雾里,看了几篇分享的博客讲的不是很明确,于是看到了一篇知乎专栏,就转载过来了。

原文地址:https://zhuanlan.zhihu.com/p/44091289

【TensorFlow笔记05】什么是数据流图?

虽然TensorFlow可直接使用Python来编写程序,但由于它的一些个性化规定之琐碎,新概念之层出不绝,用户甚至都可以把它视为一种新语言来学习。这个有点相当于CUDA之于C/C++(仅仅懂C/C++,也是玩不转CUDA的)。基于这个原因,我们有必要介绍一下TensorFlow的核心语法。

11.5.1 什么是数据流图

在本章开篇处,我们就介绍了TensorFlow名字的来历。TensorFlow最基本的一次计算流程通常是这样的:首先它接受n个固定格式的数据输入,通过特定的函数,将其转化为n个张量(Tensor)格式的输出。

一般来说,某次计算的输出很可能是下一次计算的(全部或部分)输入。整个计算过程其实是一个个Tensor 数据的流动(flow)过程。

在这其中,TensorFlow将这一系列的计算流程抽象为一张数据流图(Data Flow Graph)。

简单来说,数据流图,就是在逻辑上描述一次机器学习计算的过程。下面我们以图11-26为例,来说明TensorFlow中的几个重要概念。

图11-26 TensorFlow的数据流图

我们可以把TensorFlow中的数据流图比拟成一个工厂的装配线,每个节点要么接受要么自创原材料(即输入),然后加工处理它,在完成加工(计算)后,按照给定的方式传送给装配线的下一个加工节点。

构建数据流图时,需要两个基础元素:节点(node)和边(edge)。

  • 节点:在数据流图中,节点通常以圆、椭圆或方框表示,代表对数据的运算或某种操作。例如,在图11-26中,就有5个节点,分别表示输入(input)、乘法(mul)和加法(add)。
  • 边:数据流图是一种有向图,“边”通常用带箭头的线段表示,实际上,它是节点之间的连接。指向节点的边表示输入,从节点引出的边表示输出。输入可以来自其他数据流图,也可以表示文件读取、用户输入。输出就是某个节点的“操作(Operation,下文简称Op)”结果。在图11-26所示的例子中,节点c接受两个边的输入(2和4),输出乘法的(mul)结果8。

本质上,TensorFlow的数据流图由一系列链接在一起的函数构成,每个函数都会输出若干个值(0个或多个),以供其他函数使用。

在图11-26中,a和b是两个输入节点(input)。这类节点并非可有可无,它的作用是传递输入值,并隐藏重复使用的细节,从而可对输入操作进行抽象描述。

除了上述两个概念之外,下面3个概念也很重要,在后面的章节中会详细介绍,这里仅做简单介绍。

(1)Session(会话):根据上下文,会话负责管理协调整个数据流图的计算过程。光有数据流图还不够,如果想执行数据流图所描述的计算,还得配备一个专门的会话负责图计算。Session对象负责Python对象和数据之间进行通信,也提供内存分配和管理。
(2)Op(操作):数据流图中的一个节点,代表一次基本的操作过程。
(3)Tensor(张量):在TensorFlow 中,所有计算数据的格式,都是一个 n维数组,如 t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]],就是一个二维张量。

11.5.2 构建第一个TensorFlow数据流图

通过前面的介绍,下面我们就构建一个与图11-26相匹配的数据流图,具体代码如下范例11-1所示。

【范例11-1】TensorFlow数据流图(feed_dict.py)

import tensorflow as tf

a = tf.constant(4, name = "a") b = tf.constant(2, name = "b") c = tf.multiply(a,b, name ="c") d = tf.add(a,b, name = "d") e = tf.add(c,d, name = "e") sess = tf.Session() print(sess.run(e)) sess.close()

在Jupyter Notebook中按Shift + Enter组合键,结果如图11-27所示。

图11-27 数据流图计算结果

整体来说,TensorFlow的程序由两大部分构成:

(1)构建计算流图(如范例11-1的第03~07行)。

(2)运行计算流图(如范例11-1的第09~11行)。

下面我们来详细解析一下上述代码。

第01行代码是Python的经典用法,它的作用是导入TensorFlow库,并给它取一个简短的别名tf,方便后面引用。

第03和04行代码定义了两个输入节点a和b,在TensorFlow中,它要以数据流图的形式完成计算,所以不能像Python一样直接赋值。

比如a = 4或b = 2,这在TensorFlow计算中都是错误的,必须通过一个“操作(Operation,简称Op)”使其变成一个数据流图的节点。tf.constant( )就是要创建一个常量操作,constant( )函数本身有多个参数,其函数原型如下所示:

constant(
 value,
 dtype=None,
 shape=None,
 name='Const',
 verify_shape=False
)

第1个参数是常量数值(value);第2个参数是数据类型(dtype),指定返回张量的数据类型;第3个参数shape是可选项,表明设置张量的形状(即张量的维度);第4个参数是name,是可选项,用于指定这个操作(Op)的名称,默认值为“Const”,在本范例代码中,我们给出特定的名称,这是为了方便后期绘制流程图;第5个参数是一个布尔值,它表明是否要验证张量的形状,默认值为“False”,不进行验证。这5个参数除了第1个参数外,都有默认值,用户可以根据自己的需要指定第2~5个参数的值。

第05行代码实施乘法操作。与前面介绍的类似,在TensorFlow中,乘法也是一个标准的Op,multiply()函数的原型为:

multiply(
 x,
 y,
 name=None
)

在参数中,x和y是两个标准的张量(可以是下列类型中的任何一种,half、float32、float64、uint8、int8、uint16、int16、int32、int64、complex64、complex128),返回值是x*y的值,对这个Op也可以取一个名称name,默认值是“None”。

在本范例中,我们取名为mul_c。

这里需要说明一点,在TensorFlow 1.0(2017年2月发布)以后,tf.mul(乘法)、tf.sub(减法)和tf.neg(取负值)等API都已过时,分别被tf.multiply、tf.subtract和tf.negative取代。

由于TensorFlow的社区非常活跃,用户提交了很多有价值的代码,因此它的版本迭代速度非常快,所以如果读者在看到本书时,发现部分API过时了,版本号不是最新的,无须惊讶,因为这就是TensorFlow的特性。对于此类情况,多多查看TensorFlow的官方文档(),把握最新动态,才是正道。

第06~07行,表明加法操作,add( )函数的原型为:

add(
 x,
 y,
 name=None
)

参数的含义和乘法类似,这里不再赘述。

当整个数据流图构建完毕后,虽然它在语法上不报错,但TensorFlow并不会实质性地去执行数据流图描述的计算。这是因为,我们还需要给这个数据流图添加一个会话(Session)。

第09行,定义了一个会话。Session可理解为数据流图的运行环境,它作为TensorFlow外部计算机制的接口。

第10行,把数据流图的终点e作为会话运行run( )的参数,然后利用print打印run()的返回值。

由于开启了一个会话,可能会耗费部分系统资源,一个良好的编程习惯就是用完一个会话之后,要关闭它:

sess.close()

第11行做的就是这个工作。

当然,我们可以利用“with”上下文管理器在用完之后自动关闭它,第09~11行代码可变更为:

with tf.Session() as sess: 
         print(sess.run(e))

现在我们总结一下TensorFlow的工作流程,实际上它体现出来的是一个“惰性”方法论。

(1)构建一个计算图。图中的节点可以是TensorFlow支持的任何数学操作。

(2)初始化变量。为前期定义的变量赋初值。

(3)创建一个会话。这才是图计算开始的地方,也是体现它“惰性”的地方,也就是说,仅仅构建一个图,这些图不会自动执行计算操作,还要显式提交到一个会话中去执行,即它的执行是滞后的。

(4)在会话中运行图的计算。把编译通过的合法计算流图传递给会话,这时张量(tensor)才真正“流动(flow)”起来。

(5)关闭会话。当整个图无须再计算时,则关闭会话,以回收系统资源。

在有了活动状态的Session对象之后,下面我们还可以利用TensorBoard来可视化这个数据流图。

 

本文部分节选自《 深度学习之美:AI时代的数据处理与最佳实践》(张玉宏著,电子工业出版社,2018年7月出版)。更多理论推导及实战环节,请参阅该书。

(连载待续)

编辑于 2018-09-09

猜你喜欢

转载自www.cnblogs.com/wuxero/p/12803824.html