1.张量

1.1张量中的概念

张量(tensor)是一个数据容器,其中数据几乎都是数值数据,因此也可以说张量是数字的容器。
张量的维度(dimension)叫做轴(axis)
通常来说,深度学习中数据张量的第一个轴(即0轴,索引从0开始)是样本轴(samples axis),也被称为样本维度。批量取数据集时,得到批量张量,此时,第一个轴(0轴)也叫批量轴(batch axis)或批量维度。
张量轴的个数叫做阶(rank)
张量沿着每个轴的维度大小(即元素个数)叫形状
标量的形状为空(),向量的形状有一个元素(n,),3D张量的形状为(a,b,c)。
张量中的数据的类型一般为数值,少数情况下也可以是字符(char),但Numpy中不存在字符型张量,因为张量存储在预先分配的连续内存中,而字符串是可变的。

1.2标量(0D张量)

标量只包含一个数字,是零维张量。标量张量有0个轴。

1.3向量(1D张量)

向量是数字组成的数组,是一维张量,有1个轴。
如果向量中有5个元素,则被称为5D向量,但只有一个轴,沿着这个轴有5个元素/维度。
维度有两个意思:

  • 维度可以表示张量中轴的个数。例如:如果张量有5个轴,则被称为5D张量,或者5阶张量。
  • 维度也可以表示沿着某个轴上的元素的个数。

    1.4矩阵(2D张量)

    矩阵有两个轴(行、列)。

    1.5高维张量

    3D张量:多个矩阵组成一个数组就得到一个3D张量。
    4D张量:将多个3D张量组成一个数组,就得到一个4D张量。

    1.6实际中的数据张量

    | 向量数据 | 2D | (samples,features) | | :—-: | :—-: | :—-: | | (时间)序列数据 | 3D | (samples,timesteps,features) | | 图像 | 4D | (samples,height,width,channels)
    或者(samples,channels,height,width) | | 视频 | 5D | (samples,frames,height,width,channels)
    或者(samples,frames,channels,height,width) |

图像张量的形状有两种约定:通道在后(Tensorflow)、通道在前(Theano)。Keras框架同时支持两种。通道(channel)也叫颜色深度(color_depth),通道轴也叫深度轴,输出特征图的深度可以任意取值。

2.张量运算

除了以下运算外,仿射变换、旋转、缩放等几何操作都可以表示为张量运算。
例如:要将一个向量v旋转theta角,只需和一个矩阵A做点积,
A=[[cos(theta),sin(theta)],[-sin(theta),cos(theta )]]
神经网络是由一系列的张量运算组成,而张量运算是输入数据的几何变换,所以神经网络是输入数据在高维空间的几何变换。

2.1广播(broadcast)

两个形状不同的张量相加,较小的张量会被广播,从形状上匹配较大的张量。广播只是一种理解方式和思维模型,不是实际的实现方式。广播的做法:

  • 对较小的张量添加广播轴,使得两个张量维数一致;
  • 将较小的张量沿着广播轴重复,使得两个张量形状一致。

广播之后,两个张量形状相同,相加变成逐元素(element-wise)的运算。

2.2张量点积(product)

张量点积运算即张量积(tensor product),一般用dot运算符实现点积。向量与向量的点积即数量积,相应位置相乘相加,结果为标量。
(一般用 * 实现逐元素element-wise的乘积。)
2D张量的点积:(m,n).(n,k)—->(m,k)
高维张量的点积:(a,b,c,d).(d,k)—->(a,b,c,k)
(a,b,c,d).(d,)—->(a,b,c)

2.3张量变形(reshape)

张量变形即改变行和列,变形后张量的元素总个数没有变。
转置(transposition)是一种特殊的变形。

参考来源: 1.《Python深度学习》弗朗索瓦▪肖莱