现实世界中的数据张量

我们用几个你未来会遇到的示例来具体介绍数据张量。你需要处理的数据几乎总是以下类
别之一。
向量数据: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) 。

向量数据

这是最常见的数据。对于这种数据集,每个数据点都被编码为一个向量,因此一个数据批
量就被编码为 2D 张量(即向量组成的数组),其中第一个轴是样本轴,第二个轴是特征轴。

我们来看两个例子。
人口统计数据集,其中包括每个人的年龄、邮编和收入。每个人可以表示为包含 3 个值
的向量,而整个数据集包含 100 000 个人,因此可以存储在形状为 (100000, 3) 的 2D
张量中。
文本文档数据集,我们将每个文档表示为每个单词在其中出现的次数(字典中包含
20 000 个常见单词)。每个文档可以被编码为包含 20 000 个值的向量(每个值对应于
字典中每个单词的出现次数),整个数据集包含 500 个文档,因此可以存储在形状为
(500, 20000) 的张量中。

时间序列数据或序列数据

当时间(或序列顺序)对于数据很重要时,应该将数据存储在带有时间轴的 3D 张量中。
每个样本可以被编码为一个向量序列(即 2D 张量),因此一个数据批量就被编码为一个 3D 张
量(见图 2-3)。

现实世界中的数据张量_数据集

根据惯例,时间轴始终是第 2 个轴(索引为 1 的轴)。我们来看几个例子。
股票价格数据集。每一分钟,我们将股票的当前价格、前一分钟的最高价格和前一分钟
的最低价格保存下来。因此每分钟被编码为一个 3D 向量,整个交易日被编码为一个形
状为 (390, 3) 的 2D 张量(一个交易日有 390 分钟),而 250 天的数据则可以保存在一
个形状为 (250, 390, 3) 的 3D 张量中。这里每个样本是一天的股票数据。
推文数据集。我们将每条推文编码为 280 个字符组成的序列,而每个字符又来自于 128
个字符组成的字母表。在这种情况下,每个字符可以被编码为大小为 128 的二进制向量
(只有在该字符对应的索引位置取值为 1,其他元素都为 0)。那么每条推文可以被编码
为一个形状为 (280, 128) 的 2D 张量,而包含 100 万条推文的数据集则可以存储在一
个形状为 (1000000, 280, 128) 的张量中。

图像数据

图像通常具有三个维度:高度、宽度和颜色深度。虽然灰度图像(比如 MNIST 数字图像)
只有一个颜色通道,因此可以保存在 2D 张量中,但按照惯例,图像张量始终都是 3D 张量,灰
度图像的彩色通道只有一维。因此,如果图像大小为 256×256,那么 128 张灰度图像组成的批
量可以保存在一个形状为 (128, 256, 256, 1) 的张量中,而 128 张彩色图像组成的批量则

可以保存在一个形状为 (128, 256, 256, 3) 的张量中(见图 2-4)。

现实世界中的数据张量_数据集_02

图像张量的形状有两种约定:通道在后(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 框架同时支持这两种格式。

视频数据

视频数据是现实生活中需要用到 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 格式。