TensorFlow与自然语言处理应用
上QQ阅读APP看书,第一时间看更新

3.5 TensorFlow张量和模型会话

3.5.1 张量

在TensorFlow中,张量(Tensor)是对运算结果的引用,运算结果多数情况下是以数组的形式存储的,与numpy中的数组不同的是,张量还具有三个重要属性:名字、维度、类型。张量的名字是张量的唯一标识符,我们通过名字可以发现张量是如何被计算出来的。例如“multiply:0”代表的是计算节点“multiply”的第1个输出结果,“add:2”代表的是计算节点“add”的第3个输出结果。

TensorFlow有两种类型的边,或者说张量(Tensor)的类型有两种:

  • 正常:它们承载节点之间的数据结构。来自一个节点的一个运算或操作的输出变为另一个运算或操作的输入。连接两个节点的线携带这些数值。
  • 特殊:此边不携带数值,但是只表示两个节点(比如X和Y)之间的控制依赖关系。这意味着节点Y只有在X中的运算或操作已经执行时才会被执行。

我们也可以这样理解,TensorFlow计算图中的每个节点的输入输出都是张量(Tensor),而连接节点的边(有向线段)就是Flow,表示从一个张量(Tensor)状态到另一个张量(Tensor)状态。我们在编写程序时,都是逐步计算的,每计算完一步便能够获得一个执行结果。对于Tensor数据类型而言,虽然我们可以事先定义或者根据计算图的结构推断得到,但是有一类特殊的边中并没有数据流动,这种边便是依赖控制(Control Dependencies),其作用便是让它的起始节点执行完之后再去执行目标节点,这样一来我们就可以使用边进行灵活的条件控制了。比如,我们在TensorFlow实施中定义了依赖控制关系,便可以在其他独立的操作之间强制执行排序,以作为限制使用内存最高峰值的一种方式。

在TensorFlow中,一个张量基本上是一个n维数组,下面让我们通过表3-1中的内容来解读一下张量和维数的关系。

表3-1 张量和维数的关系

张量可以表示0阶到n阶的数组(列表)。这里,阶是张量的维数。第0阶张量是一个数,也就是标量;第1阶张量是一个一维数组,也就是向量;第2阶张量是一个二维数组,也就是矩阵;第n阶张量是一个n维数组。

3.5.2 会话

如前所述,TensorFlow中的会话(Session)用来执行事先定义好的运算,负责完成多个计算设备或集群分布式节点的布置和数据传输节点的添加,并且还负责将子图分配给相应的执行器单元进行运行。会话拥有并管理TensorFlow程序运行时的所有资源。当计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现计算资源被占用的问题。