TensorFlow机器学习(原书第2版)
上QQ阅读APP看书,第一时间看更新

2.2 表示张量

现在你已经知道了如何将TensorFlow导入到Python源文件中,让我们开始使用它吧!正如在第1章中所讨论的,一种描述现实世界中对象的简便方法是列出它的属性或特征。例如,你可以通过颜色、型号、发动机类型、里程等来描述一辆汽车。特征的有序列表被称为特征向量,这正是你在TensorFlow代码中所表达的。

特征向量由于其简单性而成为机器学习中最有用的工具。特征向量是一串数字。每个数据样本通常由一个特征向量组成,而一个好的数据集有成百上千个特征向量。毫无疑问,你经常会同时处理多个向量。矩阵可以简洁地表示一组向量,其中矩阵的每一列是一个特征向量。

在TensorFlow中表示矩阵的语法是向量的向量,向量的长度都相同。图2.1所示是一个两行三列的矩阵示例,如[[1,2,3],[4,5,6]]。注意,这个向量包含两个元素,每个元素对应于矩阵的一行。

我们通过指定元素的行和列索引来访问矩阵中的元素。例如,第一行和第一列表示左上角的第一个元素。有时,使用两个以上的索引是很方便的,例如,当引用彩色图像中的像素时,不仅根据其行和列,还根据其红/绿/蓝颜色。张量是任意维度的矩阵的泛化表示。

图2.1 图下半部分的矩阵是图上半部分的紧凑代码表示方式的可视化。这种形式的符号是科学计算库中的常见范式

张量的例子

假设一所小学强制要求所有学生都坐固定的座位。你是校长,你记名字的能力很差。幸运的是,每个教室都有一个座位网格,你可以很容易地根据排和列给一个学生起绰号。

学校有多个教室,所以你不能简单地说:“早上好4,10!再接再厉。”你还需要指定教室:“嗨,2号教室的4,10。”矩阵只需要两个索引就能指定一个元素,而这所学校的学生需要三个数字。它们属于一个3阶的张量。

张量的语法是嵌套的向量。如图2.2所示,一个2×3×2的张量为[[[1,2],[3,4],[5,6]],[[7,8],[9,10],[11,12]]],可以将其看作两个矩阵,每个矩阵的大小为3×2。因此,我们说这个张量的是3。一般来说,张量的秩是指定一个元素所需索引的数目。TensorFlow中的机器学习算法作用于张量,所以了解如何使用它们是很重要的。

图2.2 你可以把这个张量想象成多个矩阵叠加在一起。要指定一个元素,必须指明要访问的行和列以及哪个矩阵。因此,这个张量的秩是3

有多种表示张量的方法,这很容易让人迷失。直观地说,清单2.2中的三行代码试图表示相同的2×2矩阵。这个矩阵表示两个二维的特征向量。例如,它可以代表两个人对两部电影的评分。矩阵的行代表人,列代表电影,分配一个数字来描述他们对电影的评分。运行代码,看看如何在TensorFlow中生成一个矩阵。

清单2.2 表示张量的不同方法

第一个变量(m1)是一个列表,第二个变量(m2)是NumPy的ndarrayN维数组),最后一个变量(m3)是TensorFlow的常量Tensor对象,你可以使用tf.constant方法初始化它。三种初始化矩阵的方法中没有哪种一定比其他方法好,各种方法分别提供了列表值的原始集合(m1)、类型化的NumPy对象(m2)或数据流操作初始化:张量(m3)。

TensorFlow中的所有算子,比如negative,都是作用于张量对象的。一个方便的函数是tf.convert_to_tensor(...),它可以在任何地方使用,以确保处理的是张量。TensorFlow库中的大多数函数已经(冗余地)执行了这个函数,即使你忘记了这么做。使用tf.convert_to_tensor(...)是可选的,我们在这里展示它是因为它有助于揭开库作为Python编程语言的一部分处理隐式类型系统的神秘面纱。清单2.3输出了三次:

提示 为了使复制和粘贴更容易,你可以在该书的GitHub网站上找到代码清单:https://github.com/chrismattmann/MLwithTensorFlow2ed。你还会发现一个功能齐全的Docker镜像,你可以使用所有的数据、代码和库来运行书中的例子。运行docker pull chrismattmann/mltf2安装,并查看附录了解更多细节。

让我们再看一下定义张量的代码。导入TensorFlow库后,可以使用tf.contant进行如下操作。清单2.3显示了不同维度的张量。

清单2.3 创建张量

运行清单2.3的代码得到以下输出:

正如你从输出中看到的,每个张量都由恰当命名的Tensor对象表示。每个Tensor对象都有一个唯一的标签(name)、一个维度(shape)来定义它的结构,以及一个数据类型(dtype)来指定要操作的值类型。由于没有显式地提供名称,标准库自动生成了名称:Const:0Const_1:0Const_2:0

张量类型

注意,m1的每个元素都以小数点结束。小数点告诉Python元素的数据类型不是整数,而是浮点数。你可以传入显式的dtype值。与NumPy数组非常相似,张量采用你指定的将在该张量中操作的值类型。

对于一些简单的张量,TensorFlow还提供了一些便捷的构造函数。例如,构造函数tf.zeros(shape)创建一个指定形状,例如[2,3][1,2]的张量,其中所有值初始化为0。类似地,tf.ones(shape)创建一个指定形状的张量,同时将所有值初始化为1shape参数是一个类型为int32的一维(1D)张量(整数列表),描述张量的维度。

练习2.1

你将如何创建一个500×500且所有值都为0.5的张量?

答案

tf.ones([500,500])*0.5