神经网络中的数据表示
引言
当前所有机器学习系统都使用张量作为基本数据结构。张量对这个领域非常重要,重要到 Google 的 TensorFlow 都是以它来命名的。那么什么是张量?
1. 标量(0D张量)
标量(英语:scalar),又称纯量,是只有大小、没有方向、可用实数表示的一个量。实际上标量就是实数,“标量”这个称法只是为了区别于向量。标量可以是负数,例如温度低于冰点。与之相对,向量(又称矢量)既有大小,又有方向。与此相对的矢量,其分量在不同的坐标系中有不同的值,例如速度。标量可被用作定义向量空间。
——维基百科
仅包含一个数字的张量叫作标量(scalar,也叫标量张量、零维张量、0D张量)。在Numpy中,一个 float32 或 float64 的数字就是一个标量张量(或标量数组)。标量张量有0个轴(ndim == 0)。张量轴的个数也叫作阶(rank)。
下面是一个 Numpy 标量:
|
|
2. 向量(1D张量)
向量 (英语:euclidean vector,物理、工程等也称作矢量 、欧几里得向量)是数学、物理学和工程科学等多个自然科学中的基本概念。指一个同时具有大小和方向,且满足平行四边形法则的几何对象。理论数学中向量的定义为任何在向量空间中的元素。
数字组成的数组叫作向量(vector)或一维张量(1D张量)。一维张量只有一个轴。
下面是一个Numpy向量:
|
|
上面代码中所写向量有5个元素,所以被称为 5D向量。不要把 5D向量 和 5D张量 弄混!
5D向量只有一个轴,沿着轴有5个维度;而5D张量有5个轴(沿着每个轴可能有任意个维度)。
维度(dimensionality)可以表示沿着某个轴上的元素个数(比如5D向量);
阶数(order)可以表示张量轴的个数。
3. 矩阵(2D张量)
数学上,一个{\displaystyle m\times n}
的矩阵是一个由{\displaystyle m}
行(row){\displaystyle n}
列(column)元素排列成的矩形阵列。矩阵里的元素可以是数字、符号或数学式。以下是一个由6个数字元素构成的2行3列的矩阵:
——维基百科
向量组成的数组叫作矩阵(matrix)或二维张量(2D张量),矩阵有2个轴(通常叫作行和列)。
我们可以将矩阵直观地理解为数字组成的矩形网格。
下面是一个Numpy矩阵:
|
|
矩阵上第一个轴上的元素叫作行(row),第二个轴上的元素叫作列(column)。
在上面的例子中,[1, 2, 3] 是x的第一行,[1, 4, 7]是第一列。
4. 3D张量与高阶张量
将多个矩阵组合成一个新的数组,就可以得到一个3D张量,我们可以理解为由数字组成的立方体。
下面是一个Numpy的3D张量:
|
|
以此类推,4D张量便由3D张量堆叠而成,5D张量由4D张量堆叠而成……
5. 张量的关键属性
张量是由以下三个关键属性来定义的。
- 轴的个数(阶),例如,3D张量有3个轴,矩阵有2个轴。在Numpy等Python库中也叫张量的ndim。
- **形状:**形状是一个整数元组,它表示张量沿每个轴的维度大小(元素个数)。前面的示例中,矩阵的形状为(3, 3),3D张量的形状为(3,3,3),向量的形状为(5, ),而标量的形状为空,即()。
- 数据类型(在Python库中通常叫作dtype):这是张量中所包含数据的类型,例如,张量的类型可以是float32、uint8、float64等。在极少数情况下,你可能会遇到字符(char)张量。注意,Numpy(以及大多数其他库)中不存在字符串张量,因为张量存储在预先分配的连续内存段中,而字符串的长度是可变的,无法用这种方式存储。
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)