数据的形状 -- 标量、向量、矩阵、张量
在 AI 的世界里,所有数据——无论是一张图片、一段文字、还是一段音频——最终都被组织成一种统一的形式:张量(Tensor)。
张量是一个统称,按照维度的不同,它有不同的名字。
从零维到多维:层层嵌套的数据结构
另一种理解方式是「嵌套」——标量在最里面,外面套一层变成向量,再套一层变成矩阵,继续套就是更高维的张量。
在 PyTorch 和 TensorFlow 等深度学习框架中,所有数据统一用「张量(Tensor)」来表示。
标量是 0 维张量,向量是 1 维张量,矩阵是 2 维张量——它们是张量的特殊情况。
用维度(Dimension)理解数据的形状
就是一个数。比如气温 26°C。在 NumPy 中 shape 显示为空元组 ()。
一串有序的数。比如一天中每小时的气温记录。Shape 为 (n,),n 是元素个数。
一张表格,有行和列。比如一周七天、每天 24 小时的气温表。Shape 为 (行数, 列数)。
多层数据叠放。比如全国 300 个城市、每个城市一周 7 天、每天 24 小时的气温。Shape 为 (城市数, 天数, 小时数) 即 (300, 7, 24)。
维度可以简单理解为:你需要几个「坐标」才能锁定一个具体的数。
生活例子
下面用一个递进的场景来巩固理解。
场景一:记录此刻气温
你只需要写下一个数:26。这就是一个 标量。它没有维度,就是一个孤零零的值。
场景二:记录一天的气温变化
你从早到晚每小时测一次,得到 24 个数:[22, 23, 24, 26, 28, ...]。
这是一个 向量。你需要一个坐标(第几个小时)来定位某个温度值。
场景三:记录一周的气温
你把七天的数据列成一张表格:每行是一天,每列是一个小时。
这是一个 7 行 24 列的 矩阵。你需要两个坐标(第几天、第几小时)来定位。
场景四:记录全国城市的气温
全国 300 个城市,每个城市都有一张 7×24 的表格。
这 300 张表格叠在一起,形成一个 3D 张量。你需要三个坐标(哪个城市、第几天、第几小时)。
数学定义
标量 Scalar
标量是一个单独的数,记作 \( a = 26 \),或者 \( x \in \mathbb{R} \)(x 属于实数集)。
向量 Vector
向量是一组有序的数,通常竖着写(列向量):
\[ \mathbf{v} = \begin{bmatrix} v_1 \\ v_2 \\ \vdots \\ v_n \end{bmatrix} \in \mathbb{R}^{n} \]\( \mathbb{R}^{n} \) 表示这是一个 n 维实数向量,\( v_1 \) 是第 1 个分量,\( v_n \) 是第 n 个分量。
矩阵 Matrix
矩阵是一个 m 行 n 列的矩形数组:
\[ \mathbf{A} = \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \end{bmatrix} \in \mathbb{R}^{m \times n} \]记作 m×n 矩阵(m 行 n 列),\( a_{ij} \) 表示第 i 行第 j 列的元素。
张量 Tensor
张量是向量和矩阵向任意维度的推广。
一个 k 维张量的形状记作 \( (d_1, d_2, \dots, d_k) \),共 \( d_1 \times d_2 \times \cdots \times d_k \) 个元素。
对比速查表
| 名称 | 维度 | Shape 示例 | 坐标数 | 数学记号 |
|---|---|---|---|---|
| 标量 | 0 | () | 0 | \( x \in \mathbb{R} \) |
| 向量 | 1 | (n,) | 1 | \( \mathbf{v} \in \mathbb{R}^{n} \) |
| 矩阵 | 2 | (m, n) | 2 | \( \mathbf{A} \in \mathbb{R}^{m \times n} \) |
| 3D 张量 | 3 | (d1, d2, d3) | 3 | \( \mathcal{T} \in \mathbb{R}^{d_1 \times d_2 \times d_3} \) |
Python 动手实践
下面用 NumPy 来创建和查看这些数据结构。shape 属性 是理解数据维度的关键。
实例
# 标量(0 维张量):shape = ()
scalar = np.array(26)
# 向量(1 维张量):shape = (n,)
vector = np.array([22, 23, 24, 26, 28, 30, 31, 29])
# 矩阵(2 维张量):shape = (行数, 列数)
matrix = np.array([[1, 2, 3], [4, 5, 6]])
# 3D 张量:shape = (层数, 行数, 列数)
tensor_3d = np.array([[[1,2,3],[4,5,6]], [[7,8,9],[10,11,12]]])
# 4D 张量:模拟 3 张 2x2 像素的单通道图片
batch_images = np.array([
[[[10],[20]],[[30],[40]]],
[[[50],[60]],[[70],[80]]],
[[[90],[100]],[[110],[120]]]
])
print("标量: shape=", scalar.shape, " ndim=", scalar.ndim)
print("向量: shape=", vector.shape, " ndim=", vector.ndim)
print("矩阵: shape=", matrix.shape, " ndim=", matrix.ndim)
print("3D 张量: shape=", tensor_3d.shape, " ndim=", tensor_3d.ndim)
print("4D 张量: shape=", batch_images.shape, " ndim=", batch_images.ndim)
运行输出:
标量: shape= () ndim= 0 向量: shape= (8,) ndim= 1 矩阵: shape= (2, 3) ndim= 2 3D 张量: shape= (2, 2, 3) ndim= 3 4D 张量: shape= (3, 2, 2, 1) ndim= 4
Shape 属性的规律
| 属性 | 含义 | 标量 | 向量(8个元素) | 矩阵(2×3) | 3D(2×2×3) |
|---|---|---|---|---|---|
.shape | 每个维度的大小 | () | (8,) | (2, 3) | (2, 2, 3) |
.ndim | 维度数量 = len(shape) | 0 | 1 | 2 | 3 |
.size | 元素总数 | 1 | 8 | 6 | 12 |
调试深度学习代码时,看到 shape mismatch 报错,第一步就是打印 shape 查看数据维度。
理解 shape 是学习 NumPy 和所有深度学习框架的第一技能。
张量三维可视化
下面把 3×3×3 张量画成空间中的 27 个点:三个坐标轴分别对应"行、列、通道",每个点的颜色深浅代表该位置的数值大小。拖动鼠标可以旋转视角。
注意观察:固定"通道"这一层不变,你会看到一个 3×3 的平面——那正是一个二阶张量(矩阵)。这也是为什么我们说"矩阵是张量的一个特例"。
AI 中的应用场景
图像分类:从 3D 到 4D 张量
ImageNet 分类任务中,输入图片被统一缩放到 224×224 像素。单张彩色图片是 shape 为 (224, 224, 3) 的 3D 张量。
实际训练时,GPU 一次处理一个 batch(如 32 张图片),数据变为 4D 张量 (32, 224, 224, 3)。
注意不同框架的通道位置约定不同:TensorFlow/Keras 使用 (N, H, W, C)(通道在最后),PyTorch 使用 (N, C, H, W)(通道在最前)。
当你看到报错 "shape mismatch: (32, 224, 224, 3) vs (32, 3, 224, 224)",就是通道位置不一致导致的——用 .permute() 或 .transpose() 调整即可。
自然语言处理:嵌入矩阵
BERT 模型的词表大小为 30522,隐藏维度为 768。它的词嵌入矩阵 shape 为 (30522, 768)——每行是一个词的 768 维向量。
GPT 系列也是如此:GPT-2 的词表 50257,嵌入维度 768(小模型)到 1600(大模型)。
当你输入一段文本,模型首先查表把每个词 ID 转成对应的嵌入向量,这就是「查表取行」——一个矩阵索引操作。
全连接层:矩阵乘法的核心地位
一个经典的 MNIST 手写数字识别网络:输入 784 维(28×28 像素展平),第一隐藏层 256 维。
权重矩阵 W₁ 的 shape 为 (256, 784)。每次前向传播计算 h = W₁ @ x,就是 256×784 矩阵乘 784 维向量。
整个神经网络的前向传播,本质上就是一层层的矩阵乘法和激活函数的交替。
视频数据:5D 张量
视频可以理解为多帧图片的序列。一段 16 帧的 224×224 彩色视频片段,shape 为 (16, 224, 224, 3)。
加上 batch 维度后变成 5D 张量 (8, 16, 224, 224, 3)——这就是视频分类模型(如 3D-ResNet)的标准输入。
