跳转至
阅读量:

神经网络中的数据表示

引言

当前所有机器学习系统都使用张量作为基本数据结构。张量对这个领域非常重要,重要到 Google 的 TensorFlow 都是以它来命名的。那么什么是张量?

1. 标量(0D张量)

标量(英语:scalar),又称纯量,是只有大小、没有方向、可用实数表示的一个量。实际上标量就是实数,“标量”这个称法只是为了区别于向量。标量可以是负数,例如温度低于冰点。与之相对,向量(又称矢量)既有大小,又有方向。与此相对的矢量,其分量在不同的坐标系中有不同的值,例如速度。标量可被用作定义向量空间。

——维基百科

仅包含一个数字的张量叫作标量(scalar,也叫标量张量、零维张量、0D张量)。在Numpy中,一个 float32 或 float64 的数字就是一个标量张量(或标量数组)。标量张量有0个轴(ndim == 0)。张量轴的个数也叫作阶(rank)。

下面是一个 Numpy 标量:

>>> import numpy as np
>>> x = np.array(9)
>>> x
array(9)
>>> x.ndim
0

2. 向量(1D张量)

向量 (英语:euclidean vector,物理、工程等也称作矢量欧几里得向量)是数学、物理学和工程科学等多个自然科学中的基本概念。指一个同时具有大小和方向,且满足平行四边形法则的几何对象。理论数学中向量的定义为任何在向量空间中的元素。

数字组成的数组叫作向量(vector)或一维张量(1D张量)。一维张量只有一个轴。

下面是一个Numpy向量:

>>> y = np.array([12, 5, 4, 11, 9])
>>> y
array([12,  5,  4, 11,  9])
>>> y.ndim
1

上面代码中所写向量有5个元素,所以被称为 5D向量不要把 5D向量 和 5D张量 弄混!

5D向量只有一个轴,沿着轴有5个维度;而5D张量有5个轴(沿着每个轴可能有任意个维度)。

维度(dimensionality)可以表示沿着某个轴上的元素个数(比如5D向量);

阶数(order)可以表示张量轴的个数

3. 矩阵(2D张量)

数学上,一个{\displaystyle m\times n}m\times n矩阵是一个由{\displaystyle m}m行(row){\displaystyle n}n列(column)元素排列成的矩形阵列。矩阵里的元素可以是数字、符号或数学式。以下是一个由6个数字元素构成的2行3列的矩阵:

\begin{bmatrix}1 & 9 & -13 \20 & 5 & -6 \end{bmatrix}

——维基百科

向量组成的数组叫作矩阵(matrix)或二维张量(2D张量),矩阵有2个轴(通常叫作行和列)。

我们可以将矩阵直观地理解为数字组成的矩形网格。

下面是一个Numpy矩阵:

>>> z = np.array([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])
>>> z
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> z.ndim
2

矩阵上第一个轴上的元素叫作行(row),第二个轴上的元素叫作列(column)

在上面的例子中,[1, 2, 3] 是x的第一行,[1, 4, 7]是第一列

4. 3D张量与高阶张量

将多个矩阵组合成一个新的数组,就可以得到一个3D张量,我们可以理解为由数字组成的立方体。

下面是一个Numpy的3D张量:

>>> s = np.array([[[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]],
              [[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]],
              [[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]]])
>>> s
array([[[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]],

       [[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]],

       [[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]]])
>>> s.ndim
3

以此类推,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)

评论