现在位置: 首页 > AI 数学基础 > 正文

数据的形状 -- 标量、向量、矩阵、张量

在 AI 的世界里,所有数据——无论是一张图片、一段文字、还是一段音频——最终都被组织成一种统一的形式:张量(Tensor)

张量是一个统称,按照维度的不同,它有不同的名字。

从零维到多维:层层嵌套的数据结构

标量 Scalar
26
0 维:就是一个单独的数
无需坐标定位
向量 Vector
[22, 23, 24, 26]
1 维:一串有序的数
1 个坐标:第几个?
矩阵 Matrix
2D 表格
2 维:行和列组成的表格
2 个坐标:第几行?第几列?
张量 Tensor
数据立方体
3 维及以上:多层表格叠放
3+ 个坐标定位一个数

另一种理解方式是「嵌套」——标量在最里面,外面套一层变成向量,再套一层变成矩阵,继续套就是更高维的张量。

张量:一摞表
矩阵:一张表
向量:一行数字
标量:一个数

在 PyTorch 和 TensorFlow 等深度学习框架中,所有数据统一用「张量(Tensor)」来表示。

标量是 0 维张量,向量是 1 维张量,矩阵是 2 维张量——它们是张量的特殊情况。

用维度(Dimension)理解数据的形状

标量(0 维)

就是一个数。比如气温 26°C。在 NumPy 中 shape 显示为空元组 ()

向量(1 维)

一串有序的数。比如一天中每小时的气温记录。Shape 为 (n,),n 是元素个数。

矩阵(2 维)

一张表格,有行和列。比如一周七天、每天 24 小时的气温表。Shape 为 (行数, 列数)

张量(3 维及以上)

多层数据叠放。比如全国 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 属性 是理解数据维度的关键。

实例

import numpy as np

# 标量(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)0123
.size元素总数18612

调试深度学习代码时,看到 shape mismatch 报错,第一步就是打印 shape 查看数据维度。

理解 shape 是学习 NumPy 和所有深度学习框架的第一技能。


张量三维可视化

下面把 3×3×3 张量画成空间中的 27 个点:三个坐标轴分别对应"行、列、通道",每个点的颜色深浅代表该位置的数值大小。拖动鼠标可以旋转视角。

3×3×3 张量的空间分布 · 颜色越亮代表数值越大

注意观察:固定"通道"这一层不变,你会看到一个 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)的标准输入。