标量(Scalar)只有大小的概念,没有方向的概念,通过一个具体的数值就能表达完整。比如重量、温度、长度、体积、时间、热量等数据是标量。
只有一行或者一列的数组被称为向量,因此我们把向量定义为一个一维数组。向量主要有2个维度:大小、方向。箭头的长度表示大小,箭头所指的方向表示方向。
矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,元素是实数的矩阵称为实矩阵,元素是复数的矩阵称为复矩阵,而行数与列数都等于n的矩阵称为n阶矩阵或n阶方阵。
如图3-1所示,由m×n个数a ij 排成的m行n列的数表称为m行n列的矩阵,简称m×n矩阵。
图3-1
标量、向量、矩阵、张量这四个概念的维度是不断上升的,我们用点、线、面、体的概念来比喻,解释起来会更加容易:
● 点——标量。
● 线——向量。
● 面——矩阵。
● 体——张量。
0阶的张量就是标量,1阶的张量就是向量,2阶的张量就是矩阵,大于等于3阶的张量没有名称,统一叫作张量。例如:
● 标量:很简单,就是一个数,比如1、2、5、108等。
● 向量:[1,2]、[1,2,3]、[1,2,3,4]、[3,5,67,…, n]都是向量。
● 矩阵:[[1,3],[3,5]]、[[1,2,3],[2,3,4],[3,4,5]]、[[4,5,6,7,8],[3,4,7,8,9],[2,11,34,56,18]]是矩阵。
● 3阶张量:比如[[[1,2],[3,4]],[[1,2],[3,4]]]。
TensorFlow内部的计算都是基于张量的,因此我们有必要先对张量有个认识。张量在我们熟悉的标量、向量之上定义,详细的定义比较复杂,我们可以先简单地将它理解成为一个多维数组:
3 #这个 0 阶张量就是标量,shape=[] [1., 2., 3.] #这个 1 阶张量就是向量,shape=[3] [[1., 2., 3.], [4., 5., 6.]] #这个 2 阶张量就是二维数组,shape=[2, 3] [[[1., 2., 3.]], [[7., 8., 9.]]] #这个 3 阶张量就是三维数组,shape=[2, 1, 3]
这里有个容易混淆的地方,就是数学里面的3维向量、n维向量,其实指的是1阶张量(即向量)的形状,即它所包含分量的个数,比如[1,3]这个向量的维数为2,它有1和3这两个分量;[1,2,3,…,4096]这个向量的维数为4096,它有1、2、…、4096这4096个分量,说的都是向量的形状。我们不能说[1,3]这个“张量”的阶数是2,只能说[1,3]这个“1阶张量”的维数是2。矩阵也是类似,常常说的n×m阶矩阵,这里的阶指的也是矩阵的形状。
那么,张量的阶数和张量的形状怎么理解呢?阶数要看张量的最左边有多少个左中括号,有n个,则这个张量就是n阶张量。
比如,[[1,3],[3,5]]最左边有两个左中括号,它就是2阶张量;[[[1,2],[3,4]],[[1,2],[3,4]]]最左边有三个左中括号,它就是3阶张量。[[1,3],[3,5]]的最左边中括号里有[1,3]和[3,5]这两个元素,最左边的第二个中括号里有1和3这两个元素,所以形状为[2,2];[[[1,2],[3,4]],[[1,2],[3,4]]]的最左边中括号里有[[1,2],[3,4]]和[[1,2],[3,4]]这两个元素,最左边的第二个中括号里有[1,2]和[3,4]这两个元素,最左边的第三个中括号里有1和2这两个元素,所以形状为[2,2,2]。在形状的中括号中有多少个数字,就代表这个张量是多少阶的张量。