从一个数字,到一串数字,再到一张表格——当维度继续增加,我们就得到了张量。它是 AI 世界里描述数据最通用的容器。
1. 直觉引入:张量到底是什么?
先不看公式,看一张照片。一张 3×3 像素的彩色小图,每个像素有 R、G、B 三个亮度值。要完整描述这张图,你需要三个方向的坐标:第几行、第几列、哪个颜色通道。
这就是一个"三阶张量"——它不是什么神秘的新概念,只是"表格"这个想法沿着第三个方向又展开了一层。你可以把它理解成"多层叠在一起的矩阵"。
2. 数学定义
2.1 从标量到张量的统一表达
它们本质上是同一件事:一个用若干坐标索引取值的对象,只是索引的个数不同。
| 名称 | 阶数 | 需要几个坐标定位元素 | 记号 |
|---|---|---|---|
| 标量 | 0 | 0 个 | $s$ |
| 向量 | 1 | 1 个:第 $i$ 个 | $v_i$ |
| 矩阵 | 2 | 2 个:第 $i$ 行第 $j$ 列 | $M_{ij}$ |
| 张量 | $n$ | $n$ 个坐标 | $T_{i_1 i_2 \dots i_n}$ |
2.2 形状(Shape)
一个张量的"形状",描述的是它在每个方向上各有多少个元素。对于本讲的 3×3 RGB 图像:
$$ \text{shape}(T) = (3,\ 3,\ 3) \quad \text{对应 } (\text{行}, \text{列}, \text{通道}) $$
张量中元素的总个数,就是形状里所有数字的乘积:
$$ \text{元素总数} = \prod_{k=1}^{n} d_k $$
这里 $d_k$ 是第 $k$ 个维度的大小。上面例子中元素总数为 $3 \times 3 \times 3 = 27$。
2.3 两个张量的加法
形状相同的张量,加法就是对应位置的元素相加,这一点从向量、矩阵到高阶张量都是一致的:
$$ (A + B)_{i_1 i_2 \dots i_n} = A_{i_1 i_2 \dots i_n} + B_{i_1 i_2 \dots i_n} $$
3. Python 实战
用 NumPy 把上面 3×3 RGB 图像的例子跑一遍,直观感受"阶数"和"形状"这两个概念。
3.1 创建一个三阶张量
import numpy as np
# 模拟一张 3x3 像素的彩色小图,最后一维是 RGB 三个通道
image_tensor = np.random.randint(0, 256, size=(3, 3, 3))
print("阶数 (ndim):", image_tensor.ndim)
print("形状 (shape):", image_tensor.shape)
print("元素总数 (size):", image_tensor.size)
3.2 按坐标取值
# 取第 0 行、第 1 列、G 通道(索引 1)的像素值
pixel_g = image_tensor[0, 1, 1]
print("该位置 G 通道值:", pixel_g)
# 取第 0 行、第 1 列的完整 RGB 三个值(一个 1 阶张量,即向量)
pixel_rgb = image_tensor[0, 1, :]
print("该位置 RGB 向量:", pixel_rgb)
[0, 1, :] 从三阶张量里取出的结果是一个一阶张量(向量)。这说明"从高阶张量里固定几个坐标,会得到一个更低阶的张量"——这个规律在后面讲神经网络的批量数据处理时会反复用到。
4. 三维可视化:把张量"看"出来
下面用 Plotly 把这个 3×3×3 张量画成空间中的 27 个点:三个坐标轴分别对应"行、列、通道",每个点的颜色深浅代表该位置的数值大小。拖动鼠标可以旋转视角。
注意观察:固定"通道"这一层不变,你会看到一个 3×3 的平面——那正是一个二阶张量(矩阵)。这也是为什么我们说"矩阵是张量的一个特例"。
5. 与 AI 的联系
张量之所以是深度学习框架(PyTorch、TensorFlow)里最核心的数据结构,是因为几乎所有 AI 数据都能自然地表示成张量:
| 数据类型 | 典型形状 | 各维度含义 |
|---|---|---|
| 一段文本的词向量 | (序列长度, 词向量维度) | 第几个词,词向量的第几维 |
| 一张彩色图片 | (高, 宽, 通道) | 行、列、RGB 通道 |
| 一批彩色图片 | (批大小, 高, 宽, 通道) | 第几张图,再加上图片本身的三个维度 |
| 一段视频 | (帧数, 高, 宽, 通道) | 第几帧,再加上单帧图片的三个维度 |
可以看到,"批大小(batch size)"这个训练时最常调的参数,本质上就是给张量多加了一个维度。理解了张量的阶数和形状,你在调试模型时看到 shape mismatch 报错,就能立刻定位是哪个维度对不上。
点我分享笔记