5.3.1 TensorFlow概述
TensorFlow是一个采用数据流图(Data Flow Graphs),用于数值计算的开源软件库。节点(Node)和边(Edge)是TensorFlow构建数据流图的基本元素。节点在图中表示数学操作;边则表示在节点间相互联系的多维数据数组,即张量(Tensor)。
TensorFlow最基本的一次计算流程通常是这样的:首先接受N个固定格式的数据输入,然后通过特定的函数(处理),最后将其转化为N个张量格式的输出。
一般来讲,某次计算的输出很可能是下一次计算的(全部或部分)输入。整个计算过程其实就是一个个Tensor数据的流动过程,张量从图中流过的直观图像是这个工具取名为“Tensorflow”的原因。在其中,TensorFlow将这一系列的计算流程抽象为一张数据流图(Data Flow Graph)。
1)数据流图
简单来说,数据流图(也称为计算图)就是在逻辑上描述一次机器学习计算的过程。数据流图用“节点”(Node)和“边”(Edge)的有向图来描述数学计算。“节点”一般用来表示施加的数学操作,但也可以表示数据输入(input)的起点/输出(output)的终点,或者是读取/写入持久变量(persistent variable)的终点。“边”表示“节点”之间的输入/输出关系。这些数据“边”可以传输“张量”(Tensor)。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。下面以图5⁃17为例,来说明TensorFlow的几个重要概念。
(1)节点
在数据流图中,节点通常以圆、椭圆或方框表示,代表对数据的运算或某种操作。例如,在图5⁃17中,就有5个节点,分别表示输入(input)、乘法(mul)和加法(add)。

图5⁃17 数据流图
(2)边
数据流图是一种有向图,“边”通常用带箭头线段表示,实际上,它是节点之间的连接。指向节点的边表示输入,从节点引出的边表示输出。输入可以是来自其他数据流图,也可以表示文件读取、用户输入。输出就是某个节点的“操作(Operation,下文简称Op)”结果。在图5⁃17中,节点c接受两个边的输入(2和4),输出乘法的(mul)结果8。
(3)张量
Tensorflow中所有的输入输出变量都是张量,而不是基本的int、double这样的类型,即使是一个整数1,也必须被包装成一个0维的、长度为1的张量[1]。也就是说,在TensorFlow中,所有计算数据的格式,都是一个n维数组(即张量),如t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]],就是一个2维张量。
一个张量和一个矩阵差不多,可以被看成一个多维的数组,从最基本的一维到N维都可以。张量拥有阶、形状和数据类型。其中,形状可以被理解为长度。例如,一个形状为2的张量就是一个长度为2的一维数组,而阶可以被理解为维数。表5⁃1是张量和数学矩阵的对应关系,张量可以看成向量和矩阵的衍生。向量是一维的,矩阵是二维的,而张量可以是任何维度。
表5⁃1 张量与矩阵对应关系

(4)操作
操作就是数据流图中的一个节点,代表一次基本的操作过程。
(5)会话(Session)
会话负责管理协调整个数据流图的计算过程。光有数据流图还不够,如果想执行数据流图所描述的计算,还得配备一个专门的会话,来负责图计算,数据流图必须在会话中被启动,图是会话类型的一个成员。会话的主要任务是在图运算时分配CPU或GPU。(https://www.daowen.com)
(6)执行(Runner)
在建立数据流图之后,必须使用会话中的Runner来运行图,才能得到结果。在运行图时,需要为所有的变量和占位符赋值,否则就会报错。
在本质上,TensorFlow的数据流图就是一系列链接在一起的函数构成的,每个函数都会输出若干个值(0个或多个),以供其他函数使用。在图5⁃17中,a和b是两个输入节点(input)。这类节点并非可有可无,它的作用是传递输入值,并隐藏重复使用的细节,从而可对输入操作进行抽象描述。
2)TensorFlow特征
TensorFlow就是一个机器学习库,图5⁃18罗列了2016年之前来发布的用于机器学习库时间线,可以看出,除TensorFlow外,还有很多机器学习库,如Torch、Theano、Caffe和MXNet等。它们都具有一些共性:如自动求导、开源、支持多种CPU/GPU、拥有预训练模型、支持常用的神经网络(NN)架构,如递归神经网络(RNN)、卷积神经网络(CNN)和深度置信网络(DBN)等。

图5⁃18 机器学习工具演变
相对其他机器学习库,TensorFlow则还有以下特点:
①支持所有流行语言,如Python、C++、Java、R和Go。
②可以在多种平台上工作,甚至是移动平台和分布式平台。
③它受到所有云服务(AWS、Google和Azure)的支持。
④TensorFlow将Keras(—种高级神经网络API)整合。
⑤与Torch/Theano比较,TensorFlow拥有更好的计算图表可视化。
⑥允许模型部署到工业生产中,并且容易使用。
⑦有非常好的社区支持。
⑧TensorFlow不仅仅是一个软件库,它是一套包括TensorFlow、TensorBoard和TensorServing的软件。