从标量、向量到张量:深度学习里的“数字容器”到底是什么?

刚接触深度学习时,很多人会被一堆词劝退:标量、向量、矩阵、张量、维度、形状、通道、批次……这些词看起来像数学课,其实它们背后的核心很简单:深度学习处理的东西,本质上是一堆数字;这些概念只是说明数字被怎样摆放。
你可以先把它们理解成不同大小、不同结构的“数字容器”:
- 标量:一个数字。
- 向量:一排数字。
- 矩阵:一张表格。
- 张量:更通用的多维数字容器。
这篇文章不要求你有高等数学基础。我们只抓住一个目标:以后看到 shape = (32, 3, 224, 224) 这种写法时,你知道它大概在说什么。
先建立直觉:模型只认识数字#
人看到一张猫的图片,会说“这是一只猫”。但神经网络不能直接理解“猫”这个字,也不能像人一样直接理解图像含义。它真正拿到的是数字。
比如一张图片,在计算机里通常可以表示成很多像素点;每个像素点又可以用数字表示颜色。文本、声音、表格数据也一样,最后都要转成数字,模型才能计算。
所以深度学习里的问题,经常会变成:
这些数字怎么组织?模型每一步拿到的数字长什么样?
这就是标量、向量、矩阵、张量这些概念的用处。
标量:一个单独的数字#
标量就是一个数。
例如:
3
0.01
-2.7
在深度学习中,很多结果都是标量:
- 学习率
0.001是一个标量。 - 某次训练的损失值
1.26是一个标量。 - 一个分类结果的概率
0.87也可以是一个标量。
标量没有方向,也没有一排、一列、几行几列这些结构。它就是一个孤零零的数字。
如果用“维度”来描述,标量通常可以理解为 0 维。这里的 0 维不是说它不重要,而是说它没有展开成列表或表格。
向量:一排数字#
向量是一组按顺序排好的数字。
例如:
[170, 65, 23]
你可以把它理解成一个人的三个特征:身高 170、体重 65、年龄 23。单个数字只能表达一个量,一排数字就可以一起描述一个对象。
在机器学习里,一个样本经常会被表示成一个向量:
[面积, 卧室数量, 楼层, 距离地铁距离]
如果我们要预测房价,就可以把每套房子变成这样一排数字。模型拿到的不是“这套房子不错”这种自然语言,而是一组可以计算的数。
向量通常可以理解为 1 维。这里的 1 维指的是它只有一个方向可以数:从左到右数第 1 个、第 2 个、第 3 个……
需要注意:数学里向量有更丰富的含义,比如方向、长度、空间位置。深度学习入门阶段,可以先把它看作“一排数字”。这个理解已经足够你读懂大部分代码里的形状。
矩阵:排成表格的数字#
矩阵就是二维的数字表格。
例如:
[
[1, 2, 3],
[4, 5, 6]
]
它有 2 行、3 列,所以形状可以写成:
(2, 3)
这和 Excel 表格很像。你可以按“第几行、第几列”找到一个数字。
矩阵在深度学习里很常见:
- 一张灰度图片可以看成矩阵,因为每个像素只需要一个亮度值。
- 一批样本的特征可以排成矩阵,每一行是一个样本,每一列是一个特征。
- 神经网络中的权重也经常以矩阵形式存在。
举个小例子。假设有 3 套房子,每套房子有 4 个特征:
[
[80, 2, 10, 500],
[120, 3, 6, 800],
[60, 1, 20, 300]
]
这就是一个 3 x 4 的矩阵。3 表示 3 个样本,4 表示每个样本有 4 个特征。
矩阵通常可以理解为 2 维,因为你需要两个位置才能确定一个数字:行和列。
张量:更通用的多维数字容器#
张量可以理解为标量、向量、矩阵的统一说法,也可以表示更高维的数字结构。
更口语一点说:
张量就是一个可以装数字的多维容器。
按照这个理解:
- 标量是 0 维张量。
- 向量是 1 维张量。
- 矩阵是 2 维张量。
- 三维、四维、五维的数据,也都可以叫张量。
深度学习框架里,比如 PyTorch、TensorFlow,经常直接把模型里的数据都叫 Tensor。这不是因为每个数据都神秘复杂,而是因为框架需要一个统一的数据结构来承载各种形状的数字。
维度和形状:读懂张量的关键#
学习张量时,最重要的不是背定义,而是看懂两个词:维度 和 形状。
维度可以理解为“需要几个坐标才能找到一个数字”。
- 标量:直接就是一个数,不需要坐标。
- 向量:需要 1 个位置,例如第几个。
- 矩阵:需要 2 个位置,例如第几行、第几列。
- 三维张量:需要 3 个位置,例如第几层、第几行、第几列。
形状则是在说“每个维度上有多少个元素”。
例如:
[10, 20, 30]
它的形状是:
(3,)
表示这一排里有 3 个数字。
再看一个矩阵:
[
[1, 2, 3],
[4, 5, 6]
]
它的形状是:
(2, 3)
表示 2 行、3 列。
在深度学习里,shape 往往比变量名更诚实。变量名可能叫 x,看不出是什么;但 x.shape 能告诉你它到底是一个样本、一批样本,还是一批图片。
一张图片为什么也是张量?#
我们用图片举例,因为它最直观。
一张灰度图片只有明暗,没有颜色。假设它高 4、宽 5,那么可以用一个 4 x 5 的矩阵表示:每个位置放一个亮度值。
但彩色图片通常有红、绿、蓝三个通道,也就是 RGB。于是它不再只是一个二维表格,而是可以理解为三张表叠在一起:
- 一张表记录红色强度。
- 一张表记录绿色强度。
- 一张表记录蓝色强度。
所以一张彩色图片经常可以表示成:
(3, H, W)
其中:
3表示 RGB 三个颜色通道。H表示图片高度。W表示图片宽度。
如果图片是 224 x 224,那么它可能写成:
(3, 224, 224)
这就是一个 3 维张量。
为什么训练时经常多一个批次维度?#
实际训练神经网络时,模型通常不会一次只看一张图片,而是一次看一小批图片。这个“一小批”通常叫 batch,中文常说“批次”。
如果一张彩色图片的形状是:
(3, 224, 224)
那么 32 张图片一起放进模型时,形状可能变成:
(32, 3, 224, 224)
这 4 个数字可以这样读:
32:这一批里有 32 张图片
3 :每张图片有 3 个颜色通道
224:图片高度是 224
224:图片宽度是 224
这就是很多初学者第一次见到四维张量的地方。它并不是凭空多出来的复杂数学,而是因为我们把“很多张图片”打包在一起了。
张量里的维度顺序一定固定吗?#
不一定。
不同框架、不同模型、不同数据处理习惯,可能采用不同的维度顺序。例如图片数据常见两种写法:
NCHW = (批次, 通道, 高度, 宽度)
NHWC = (批次, 高度, 宽度, 通道)
PyTorch 里常见的是 NCHW,例如:
(32, 3, 224, 224)
TensorFlow 的很多场景里常见的是 NHWC,例如:
(32, 224, 224, 3)
这两个张量装的可能是同一批图片,只是维度排列顺序不同。
所以遇到张量时,不要只看它有几个维度,还要确认每个维度代表什么。很多模型报错,本质上就是“维度顺序放错了”。
一个特别实用的理解方法:从 shape 倒推含义#
如果你在代码里看到:
x.shape
输出:
(64, 10)
你可以先猜:这可能是 64 个样本,每个样本 10 个特征。
如果看到:
(16, 3, 224, 224)
你可以猜:这可能是 16 张彩色图片,每张图片 3 个通道,大小是 224 x 224。
如果看到:
(8, 128, 768)
在自然语言处理里,它可能表示:8 条文本,每条文本有 128 个 token,每个 token 被表示成 768 维向量。
这就是张量的核心价值:它让不同类型的数据都能变成统一的数字形状,然后交给模型做计算。
常见误区#
误区一:张量一定很高级,和普通数组不是一回事#
入门阶段可以先把张量理解成“多维数组”。它当然有数学背景,也有自动求导、GPU 加速等工程能力,但最基础的直觉就是:里面装着数字,并且这些数字有形状。
误区二:维度越高,模型就越厉害#
不是。维度高只说明数据组织更复杂,不代表模型一定更强。错误的维度反而会让模型无法运行,或者学到错误的东西。
误区三:只要数字总数一样,就可以随便 reshape#
也不是。
比如 12 个数字可以 reshape 成 (3, 4),也可以 reshape 成 (2, 6)。但形状改变后,每个维度的含义可能完全变了。模型关心的不只是有多少数字,还关心这些数字之间的结构关系。
举例说,一张图片的高和宽不能随便当成通道维度,否则模型看到的数据结构就乱了。
总结:把张量看成“有形状的数字”#
最后把这几个概念串起来:
| 概念 | 可以怎么理解 | 常见形状示例 | 例子 |
|---|---|---|---|
| 标量 | 一个数字 | () | 损失值、学习率 |
| 向量 | 一排数字 | (3,) | 一个样本的特征 |
| 矩阵 | 二维表格 | (2, 3) | 灰度图片、样本特征表 |
| 张量 | 多维数字容器 | (32, 3, 224, 224) | 一批彩色图片 |
如果你是初学者,先记住这一句话就够了:
深度学习里的张量,就是模型用来装数据的多维数字容器;看懂它的 shape,就看懂了数据是怎么摆放的。
之后再学神经网络、卷积、注意力机制、反向传播时,你会不断遇到张量。只要你养成一个习惯:看到数据先看 shape,很多看起来复杂的问题都会变得清楚很多。