一般来说,当前所有机器学习系统都使用张量作为基本数据结构。
张量的核心在于,它是一个数据容器。它包含的数据几乎总是数值数据,因此它是数字的容器。如矩阵,它是二维张量。张量是矩阵向任意维度的推广。【注意:张量的维度(dimension)通常叫做轴(axis)】
一、不同维度张量介绍
1.1、标量(0D张量)
仅包含一个数字的张量叫作
标量
(
scalar
,也叫标量张量、零维张量、0D 张量)。在 Numpy 中,一个
float32
或 float64 的数字就是一个标量张量(或标量数组)。
可以用ndim属性来查看一个Numpy张量的轴的个数。标量张量有0个轴(ndim==0).张量轴的个数也叫作阶(rank).
1.2、向量(1D张量)
数字组成的数组叫做向量(vector)或一维张量(1D张量)。一维张量只有一个轴。
这个向量有
5
个元素,所以被称为
5D
向量
。不要把
5D
向量和
5D 张量弄混! 5D 向量只有一个轴,沿着轴有
5
个维度,而
5D
张量有
5
个轴(沿着每个轴可能有任意个维度)。维度 (
dimensionality
)可以表示沿着某个轴上的元素个数(比如
5D 向),也可以表示张量中轴的个 数(比如 5D 张量),这有时会令人感到混乱。对于后一种情况,技术上更准确的说法是
5 阶张量 (张量的阶数即轴的个数),但
5D
张量
这种模糊的写法更常见。
1.3、矩阵(2D张量)
向量组成的数组叫做矩阵(matrix)或二维张量(2D张量)。矩阵有2个轴(通常叫做行和列)。
第一个轴上的元素叫做行(row),第二个轴上的元素叫做列(column).
1.4、3D张量与更高维张量
将多个矩阵组合成一个新的数组,可以得到一个3D张量。
将多个3D张量组合成一个数组,可以创建一个4D张量,以此类推。深度学习处理的一般是0D到4D的张量,但处理视频 数据时可能会遇到5D张量。
二、关键属性
张量是由以下三个关键属性定义的。
1)轴的个数(阶)。例如,3D张量有3个轴,矩阵有2个轴。
2)形状。这是一个整数元组,表示张量沿着每个维度的大小(元素个数)。例如,上面示例中矩阵的形状为(3, 5),3D张量示例的形状为(3,3,5)。向量的形状只包含一个元素,比如(5,),而标量的形状为空,即()。
3)数据类型(在Python库中通常叫做dtype)。
这是张量中所包含数据的类型,例如,张
量的类型可以是
float32
、
uint8
、
float64
等。在极少数情况下,你可能会遇到字符
(
char
)张量。注意,
Numpy
(以及大多数其他库)中不存在字符串张量,因为张量存
储在预先分配的连续内存段中,而字符串的长度是可变的,无法用这种方式存储。
三、现实世界中的数据张量
1)向量数据:2D张量,形状为(samples, features)。
2)时间序列数据或序列数据:3D张量,形状为(samples,timestamps,features)。
3)图像:4D张量,形状为(samples, height,width,channels)或(samples,channels,height,width)。
4)视频:5D张量,形状为(samples,frames, height,width,channels)或(samples,frames,channels,height,width)。
3.1各张量示例
3.1.1 向量数据
这是最常见的数据。对于这种数据集,每个数据点都被编码为一个向量,因此一个数据批 量就被编码为 2D 张量(即向量组成的数组),其中第一个轴是
样本轴
,第二个轴是
特征轴
。
例子:
人口统计数据集,其中包括每个人的年龄、邮编和收入。每个人可以表示为包含
3 个值 的向量,而整个数据集包含
100 000
个人,因此可以存储在形状为
(100000, 3)
的 2D 张量中。
3.1.2 时间序列或序列数据
当时间(或序列顺序)对于数据很重要时,应该将数据存储在带有时间轴的
3D 张量中。 每个样本可以被编码为一个向量序列(即 2D 张量),因此一个数据批量就被编码为一个
3D 张 量。
例子:
股票价格数据集。每一分钟,我们将股票的当前价格、前一分钟的最高价格和前一分钟 的最低价格保存下来。因此每分钟被编码为一个 3D 向量,整个交易日被编码为一个形 状为
(390, 3)
的 2D 张量(一个交易日有
390
分钟),而 250 天的数据则可以保存在一 个形状为
(250, 390, 3)
的 3D 张量中。这里每个样本是一天的股票数据。
3.1.3 图像数据
图像通常具有三个维度:高度、宽度和颜色深度。虽然灰度图像(比如 MNIST 数字图像) 只有一个颜色通道,因此可以保存在
2D 张量中,但按照惯例,图像张量始终都是 3D 张量,灰 度图像的彩色通道只有一维。因此,如果图像大小为
256
×
256,那么 128 张灰度图像组成的批 量可以保存在一个形状为
(128, 256, 256, 1)
的张量中,而
128 张彩色图像组成的批量则
可以保存在
一
个形状为
(128, 256, 256, 3)
的张量中。
图像张量的形状有两种约定:
通道在后(channels-last
)的约定(在
TensorFlow 中使用)和 通道在前(channels-first
)的约定(在
Theano
中使用)。
Google
的
TensorFlow 机器学习框架将 颜色深度轴放在最后:
(samples, height, width, color_depth)
。与此相反,Theano 将图像深度轴放在批量轴之后:
(samples, color_depth, height, width)。如果采 用
Theano
约定,前面的两个例子将变成
(128, 1, 256, 256)
和
(128, 3, 256, 256)。 Keras
框架同时支持这两种格式。
3.1.4 视频数据
视频数据是现实生活中需要用到 5D 张量的少数数据类型之一。视频可以看作一系列帧, 每一帧都是一张彩色图像。由于每一帧都可以保存在一个形状为 (height, width, color_ depth) 的 3D 张量中,因此一系列帧可以保存在一个形状为 (frames, height, width, color_depth)
的 4D 张量中,而不同视频组成的批量则可以保存在一个
5D 张量中,其形状为 (samples, frames, height, width, color_depth)
。
例子:
举个例子,一个以每秒
4
帧采样的
60
秒
YouTube
视频片段,视频尺寸为
144
×
256,这个 视频共有
240
帧。
4
个这样的视频片段组成的批量将保存在形状为 (4, 240, 144, 256, 3) 的张量中。总共有
106 168 320
个值!如果张量的数据类型(
dtype
)是
float32,每个值都是 32
位,那么这个张量共有
405MB。好大!你在现实生活中遇到的视频要小得多,因为它们不以 float32
格式存储,而且通常被大大压缩,比如
MPEG
格式。