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的ndarray
(N维数组),最后一个变量(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:0
、Const_1:0
和Const_2:0
。
张量类型
注意,m1
的每个元素都以小数点结束。小数点告诉Python元素的数据类型不是整数,而是浮点数。你可以传入显式的dtype
值。与NumPy数组非常相似,张量采用你指定的将在该张量中操作的值类型。
对于一些简单的张量,TensorFlow还提供了一些便捷的构造函数。例如,构造函数tf.zeros(shape)
创建一个指定形状,例如[2,3]
或[1,2]
的张量,其中所有值初始化为0
。类似地,tf.ones(shape)
创建一个指定形状的张量,同时将所有值初始化为1
。shape
参数是一个类型为int32
的一维(1D)张量(整数列表),描述张量的维度。
练习2.1
你将如何创建一个500×500且所有值都为0.5的张量?
答案
tf.ones([500,500])*0.5