TensorFlow的相关术语

本节教程将简单地介绍 TensorFlow 的基本概念。

1.计算图

计算图(Computation Graph)是一个有向图(Directed Graph),是对 TensorFlow 中计算任务的抽象描述,也称为数据流图(Data Flow Graph)。TensorFlow 使用计算图将计算表示成独立指令之间的依赖关系。在计算图中,节点表示计算单元(即一个独立的运算操作),图中的边表示计算使用或产生的数据。

TensorFlow1.x 采用的是静态计算图机制,即我们使用 TensorFlow 低级 API 编程时,要先定义好计算图,再创建 TensorFlow 会话(Session)来执行计算图,可以反复调用它(1.x 版本提供的 Eager Execution 接口可以让用户使用动态计算图)。

TensorFlow2.0 则采用了动态计算图机制(1.x 版本的 Eager Execution 在 2.0 中成为默认的执行方式),可以像执行普通的 Python 程序一样执行 TensorFlow 的代码,而不再需要自己预先定义好计算图,调试代码也更加容易。TensorFlow1.x 的静态计算图机制一直被用户所诟病,调整为动态计算图机制是 TensorFlow2.0 的一个重大改进,并且提供了方法,以保留静态计算图的优势。

2.会话

在 1.x 版本中,会话(Session)是客户端程序与 TensorFlow 系统进行交互的接口,我们定义好的计算图必须在会话中执行。当会话被创建时会初始化一个空的图,客户端程序可以通过会话提供的“Extend”方法向这个图中添加新的节点来创建计算图,并通过“tf.Session”类提供的“run”方法来执行计算图。在大多数情况下只需要创建一次会话和计算图,之后可以在会话中反复执行整个计算图或者其中的某些子图。

TensorFlow2.0 采用了动态计算图机制,就不需要在会话中执行计算图了,“tf.Session”类被放到了兼容模块“TensorFlow.compat.v1”中,这个模块里有完整的 TensorFlow1.x 的 API。为了保留静态计算图的优势(例如性能优化和可移植性等), TensorFlow2.0 提供了“tf.function”方法,对于使用“tf.function”方法修饰的 Python 函数,TensorFlow 可以将其作为单个图来运行。

3.运算操作和运算核

计算图中的每一个节点就是一个运算操作(Operation,通常简称 Op),每一个运算操作都有名称,并且代表了一种类型的抽象运算,例如“MatMul”代表矩阵的乘法。每个运算操作都可以有自己的属性,但是所有的属性都必须被预先设置,或者能够在创建计算图时根据上下文推断出来。

通过设置运算操作的属性可以让运算操作支持不同的张量(Tensor)元素类型,例如让向量加法操作运算只接收浮点类型的张量。运算核(Kernel)是一个运算操作在某个具体的硬件(比如 CPU 或 GPU)上的实现,在 TensorFlow 中可以通过注册机制加入新的运算操作或者为已有的运算操作添加新的运算核。

表 1 所示的是 TensorFlow 中的一些内建运算操作。
表 1:TensorFlow 的部分运算操作
运算类型 运算示例
标量运算 Add, Sub, Mul, Div, Exp, Log, Greater, Less, Equal 等
向量运算 Concat, Slice, Split, Constant, Rank, Shape, Shuffle 等
矩阵运算 MatMul, MatrixInverse, MatrixDeterminant 等
带状态的运算 Variable, Assign, AssignAdd 等
神经网络组件 SoftMax, Sigmoid, ReLU, Convolution2D, MaxPool 等
模型的保存和恢复 Save, Restore
队列及同步运算 Enqueue, Dequeue, MutexAcquire, MutexRelease 等
控制流 Merge, Switch, Enter, Leave, NextIteration

4.张量

张量(Tensor)可以看作一个多维的数组或列表,它是对矢量和矩阵的更高维度的泛化,张量由“tf.Tensor”类定义。计算图中的一个运算操作可以获得 0 个或多个张量作为输入,运算后会产生 0 个或多个张量输出。这些张量在计算图的边中流动(Flow),从一个节点(运算操作)到另一个节点,TensorFlow 也因此而得名。

张量具有以下两个属性:
  • 数据类型(同一个张量中的每个元素都具有相同的数据类型,例如 float32、int32 及 string);
  • 形状(即张量的维数及每个维度的大小)。

表 2 所示的是 TensorFlow 中张量的形状示例。
表 2:TensorFlow 中张量的形状示例
阶(维数) 数学实例 示 例
0 (0~D) 标量 整数 5、字符串 "hello"
1 (1~D) 矢量 列表 [1,3,5]
2 (2~D) 矩阵 一个 3×3 的矩阵
3 (3~D) 3 阶张量 一个 3×3×5 的 3 维张量
n (n~D) n 阶张量 一个 D0×D1…×Dn 的 n 阶张量

TensorFlow 有一些特殊的张量,如下所示:
  • tf.Variable:变量。TensorFlow 中的张量一般都不会被持久化保存,参与一次运算操作后就会被丢弃了。而变量是一种特殊的张量。对于那些需要被持久化保存的张量,可以用变量来代替。

    我们可以使用“tf.Variable”类来定义和操作变量,该类提供了一些操作让我们可以对变量的值进行更改,例如“assign”和“assign_add”等。模型的参数一般都是使用变量来存储的,在模型训练的过程中,参数会不断地更新。变量的值可以修改, 但是其维度不可以改变。

  • tf.constant:常量。常量定义时必须初始化值,且定义后其值和维度不可再改变。
  • tf.placeholder:占位符。在执行“session.run()”方法时传入具体的值, TensorFlow2.0 中不再使用,但依然可以在“TensorFlow.compat.v1”模块中找到。
  • tf.SparseTensor:稀疏张量。