神经网络的数据表示

张量(tensor) 是一个数据容器, 它包含的数据几乎总是数值数据, 因此它的数字容器, 张量是矩阵向任意维度的推广, 维度(dimension) 通常也叫作 轴(axis).

标量(scalar): 仅包含一个数字的张量叫作 标量(标量张量, 零维张量, 0D 张量), 一个 float32 或 float64 的数字就是一个标量张量.

x = numpy.array(12)

向量(vector): 数字组成的数组叫作 向量(一维张量, 1D 张量), 张量有一个轴.

x = numpy.array([12, 3, 6, 14, 7])

矩阵(matrix): 向量组成的数组叫作 矩阵(二维张量, 2D 张量), 矩阵有两个轴(行, 列).

x = numpy.array([
    [5, 78, 2, 34, 0],
    [6, 79, 3, 35, 1],
    [7, 80, 4, 36, 2]])

3D张量与更高维的张量: 矩阵组成的数据叫作 3D 张量, 3D 张量组成的数组叫作 4D 张量, 以此类推.

x = numpy.array([
    [[5, 78, 2, 34, 0],
    [6, 79, 3, 35, 1],
    [7, 80, 4, 36, 2]],
    [[5, 78, 2, 34, 0],
    [6, 79, 3, 35, 1],
    [7, 80, 4, 36, 2]],
    [[5, 78, 2, 34, 0],
    [6, 79, 3, 35, 1],
    [7, 80, 4, 36, 2]],
    ])

深度学习处理的一般是 0D 到 4D 的张量, 但处理视频数据时可能会遇到 5D 张量.

关键属性

张量是由三个关键属性来定义的.

轴的个数(阶): 3D 张量有 3 个轴, 矩阵有 2 个轴, 这在 Numpy 等 Python 库中也叫作张量的 ndim. 形状: 这是一个整数元组, 表示张量沿每个轴的维度大小, 举例: 1.1 中的矩阵形状为 (3, 5), 3D 张量为 (3, 3, 5), 向量为 (5,) 标量为 (). 数据类型: 在 Python 库中通常叫作 dtype, 这是张量中包含数据的类型, 张量的类型可以是 uint8, float32, float64 等, 在极少情况下会遇到 字符(char) 张量.

在 Numpy 中操作张量

# 选择第 10-100 个数字(不包括 100), 有以下三种写法
my_slice = train_images[10:100]
my_slice = train_images[10:100, :, :]
my_slice = train_images[10:100, 0:28, 0:28]
# 取出所有图像右下角 14*14 的像素区域
my_slice = train_images[:, 14:, 14:]
# 取出所有图像中间 14*14 的像素区域
my_slice = train_images[:, 7:-7, 7:-7]

数据批量的概念

深度学习中所有数据的张量的第一个 轴(0 轴) 都是 样本轴(samples axis), 深度学习模型不会同时处理整个数据集, 而是将数据分成 N 个小批量.

batch = train_images[:128]
# 下一批
batch = train_images[128:256]
# 然后是第 N 批
batch = train_images[128 * n: 128 * (n + 1)]

现实中的数据张量

在现实中, 需要处理的数据几乎是以下几类别之一.

向量数据: 2D 张量, 形状为 (samples, features).

  1. 人口统计数据集, 每个人包含 年龄, 收入, 100 000个人的数据集形状为 (100000[samples], 2[features]).
  2. 文本文档数据集, 每个文档表示为单词出现的个数 (字典中包含 20 000 个常见的单词), 每个文档可以被编码为包含 20 000 个值的向量中, 整个数据集包含 500 个文档, 因此可以存储在形状为 (500, 20000) 的 2D 张量中.

时间序列&序列数据: 3D 张量, 形状为 (samples, timesteps, features).

依照惯例, 时间始终是第二轴.

  1. 股票价格数据集, 股票当前价格, 前一分钟最高价格, 前一分钟最低价格 可以看作为 4D 向量形状为 (3[features]), 整个交易日(390分钟)可以编码为一个 2D 张量形状为 (390[samples], 3[features]), 250天的数据集形状为 (250[samples], 390[timesteps], 3[features]).
  2. 推文数据集, 每个推文编码为 280 个字符组成的序列, 而每个字又来自与 20 000 个常用单词的字典中, 这种情况下每个字符可以被编码为 20000D 的向量中, 那么每个推文可以被编码为一个形状为 (280[samples], 20000[features]) 的 2D 向量中, 100 万推文的数据集则可以存储在一个形状为 (1000000[samples], 280[steps], 20000[features]) 的 3D 张量.

图像: 4D 张量, 形状为 (samples, height, width, channels) 或 (samples, channels, height, width).

图片具有三个维度: 高度, 宽度, 和颜色深度 (虽然灰度图像 比如 MNIST 数字图像 只有一个颜色通道, 因此可以保存在 2D 张量中, 但按照惯例图像张量始终都是 3D 张量).

  1. 灰度图像的颜色通道只有一维, 因此如果图像大小为 256*256 ,那么 128 张组成的批量可以保存在形状为 (128, 256, 256, 1) 的 4D 张量中.
  2. 彩色图像的颜色通道有 3 个 (R G B), 那么 128 张组成的批量可以保存在形状为 (128, 256, 256, 3) 的 4D 张量中.

图像张量的形状有两种约定: 通道在后(channels-last) 的约定 (在 TensorFlow 中使用) 和 通道在前(channels-first) 的约定 (在 Theano 中使用).

视频: 5D 张量, 形状为 (samples, frames, height, width, channels) 或 (samples, frames, channels, height, width).

  1. 一个以每秒 24 帧采样的 60 秒 YouTube 视频片段, 视频尺寸为 144*256 这个视频一共有 240 帧, 4 个这样的视频组成的批量将保存在形状为(4[samples], 240[frames], 144[height], 256[width], 3[channels]) 的 5D 张量中.