张量是TensorFlow中一个非常重要的概念,接下来就详细介绍什么是张量。
如果一个物理量,无论从哪个方向看都只是一个单值,那么它就是普通的标量,典型的例子如密度、温度等。如果从不同的方向看,它有不同的值,即在统一参考系下的不同坐标轴上有不同的投影值,那么它就是张量,典型的例子如力、速度、数字图像等。
用一句话解释,那就是张量是有大小和方向的量。这里的方向是指张量的阶或维度。
在TensorFlow程序中所有的数据都用张量的形式表示,如数组、矩阵、列表等。
其中,零维张量表示标量,也就是一个数;一维张量为向量(图2-11),也就是一维数组;二维张量可以用一个矩阵表示(图2-12);三维张量是由多个矩阵平面组成的“立方体”,好像一块积木(图2-13)。
图2-11 一维张量
图2-12 二维张量
图2-13 三维张量
如果把三维张量看成一个立方体(图2-14),就可以进一步构造更高维的张量。例如,若干个三维张量“立方体”排列起来,就构成了四维张量;多个四维张量排列起来,就构成了五维张量(图2-15)。本书中最多用到四维张量。
图2-14 把三维张量看成一个立方体
图2-15 四维、五维张量
在TensorFlow中,定义张量的方式有很多种,本书推荐使用Numpy定义张量,手动为张量每个维度的每个元素赋值。Numpy是一个专门为数组运算而设计的科学计算软件包,它提供了许多高级的数值计算功能。Numpy与TensorFlow是集成在一起的。
下面举例说明如何在代码中用Numpy定义张量。
在上述代码中,首先导入Numpy模块,然后通过np.array()方法定义一维张量x、一维张量y、二维张量z。可能有些读者还不知道如何确定张量的维数,接下来就通过学习张量的形状,搞清楚张量的维数等问题。
张量的形状是用包含有序整数集的列表(List)或元组(Tuple)表示的。形状列表的元素数量即张量的维数,元素数值即每一维的长度。熟练掌握张量的形状,是理解TensorFlow的重要基础。
要查看张量的形状,需要用到shape()方法。依然采用前面的案例,下面添加打印张量x、y、z的形状的代码。
输出结果如下:
其中,(1,)表示张量x的维数为1,且该维度有1个元素;(5,)表示张量y的维数为1,该维度有5个元素;(2, 3)表示张量z的维数为2,第一维有2个元素,第二维有3个元素。
再看一个稍微复杂的例子,以加深对张量形状的理解。
输出结果如下:
下面对上述代码进行解释。
这是张量x的定义,它的形状为shape=(0,),表示x是零维张量,也就是标量。
这是张量y的定义,它的形状为shape=(1,),说明y是一维张量;(3,)代表张量y的第1维有3个元素。
这是张量z的定义,shape=(2,)表示z是二维张量;(3, 5)代表它的第1维有3个元素,第2维有5个元素。
上述代码定义了张量m,它的形状为shape=(3,),表示m为三维张量;(2, 3, 5)表示m的第1维有2个元素,第2维有3个元素,第3维有5个元素。
像z、m这种复杂张量的形状,有什么简单的方法去辨识吗?当然有,这个简单的方法就是找方括号和逗号。从外到内,每一层方括号代表一个维度;每一层方括号中用逗号分成了几部分,就代表这个维度有几个元素。下面按照此方法,重新分析一下张量z。
首先找到代表第1维的最外层方括号,其中由2个逗号分隔出3个元素,这表示第1维有3个元素。
接下来,在第1维的3个元素中任取一个,找到代表第2维的方括号,其中由4个逗号分隔出5个元素,这表示第2维有5个元素。
再往里已经没有方括号了,因此张量z为二维张量,第1维有3个元素,第2维有5个元素。