一、 引言:张量运算的基石
在深度学习的世界里,我们每天都要和张量(Tensor)打交道。
- 随机函数:是构建神经网络的“起点”。无论是初始化权重参数,还是生成模拟数据进行测试,都离不开它。
- 广播机制:是张量运算的“魔法”。它让不同形状的张量也能进行加减乘除,极大地简化了代码编写。
掌握这两个基础概念,对于理解后续复杂的网络结构(如注意力机制、卷积操作)至关重要。
二、 随机张量的生成
在 PyTorch 中,我们不需要每次都加载真实的图片数据来测试代码。使用随机函数生成张量,既快速又方便。
1. torch.randn() - 标准正态分布
这是最常用的函数之一。它生成的随机数符合标准正态分布(均值为 0,标准差为 1)。
- 用途:常用于神经网络的权重初始化,因为正态分布能让参数在训练初期保持较好的分布特性。
- 示例:
# 生成一个 [batch=2, channel=3, height=224, width=224] 的 4 维张量
# 模拟 2 张 RGB 彩色图片
tensor_4d = torch.randn(2, 3, 224, 224)
2. 其他常见随机函数
虽然函数很多,但只需记住几个核心的:
torch.rand():生成 [0, 1) 之间的均匀分布随机数。常用于生成概率值或归一化后的数据模拟。torch.randint():生成指定范围内的整数。常用于生成随机标签(Label)或索引。
# 生成 3 个 0 到 9 之间的随机整数
labels = torch.randint(low=0, high=10, size=(3,))
三、 维度变换实战:从输入到输出
理解一个张量在网络中流动时形状(Shape)的变化,是调试代码的基本功。
让我们以一个经典的 CNN 处理流程为例,看看张量是如何“变形”的:
- 输入层:
[1, 3, 32, 32](Batch, Channel, Height, Width)- 模拟一张 32x32 的彩色图片。
- 卷积层 (Conv2d):
[1, 16, 32, 32]- 卷积核数量为 16,提取了 16 种特征。由于使用了
padding=1,长宽保持不变。
- 卷积核数量为 16,提取了 16 种特征。由于使用了
- 池化层 (MaxPool2d):
[1, 16, 16, 16]- 长宽减半,保留最显著的特征,减少计算量。
- 展平 (Flatten):
[1, 4096]- 将多维特征拉直成一维向量 (16 * 16 * 16 = 4096),准备送入全连接层。
- 全连接层 (Linear):
[1, 128]->[1, 10]- 逐步降维,最终输出 10 个类别的得分。
- Softmax:
[1, 10]- 将得分转换为概率分布,总和为 1。
技巧:在写代码时,多用 print(tensor.shape) 打印维度,或者使用 PyCharm 的调试功能,能帮你快速定位维度不匹配的错误。
四、 广播机制 (Broadcasting) 深度解析
广播机制是 PyTorch 中最“聪明”的特性。当两个张量形状不同时,它会自动“脑补”缺失的维度,让运算得以进行。
1. 核心规则
PyTorch 会从右向左逐个比较维度:
- 如果两个维度相等,没问题,继续比较下一个。
- 如果其中一个维度是 1,则该维度会被自动扩展(复制)成另一个张量的大小。
- 如果一个张量缺少某个维度,则视为在该维度前补 1。
- 如果维度既不相等,也不为 1,且都不缺失,则报错。
2. 形象化图解
想象一下,你有一个 (3, 1) 的列向量和一个 (3,) 的行向量相加。
- 列向量会在水平方向“复制”自己 3 次,变成
(3, 3)。 - 行向量会在垂直方向“复制”自己 3 次,变成
(3, 3)。 - 最终,两个
(3, 3)的矩阵对应位置相加。 - 注意:这只是逻辑上的复制,内存中并不会真的创建新数据,所以非常高效。
3. 实战案例
案例 A:二维 + 一维 (最常见)
a = torch.tensor([[10], [20], [30]]) # Shape: (3, 1)
b = torch.tensor([1, 2, 3]) # Shape: (3,)
# 过程解析:
# b 补全为 (1, 3) -> 扩展为 (3, 3) (复制行)
# a 扩展为 (3, 3) (复制列)
# 结果 Shape: (3, 3)
result = a + b
案例 B:三维 + 二维 (批量处理)
a = torch.randn(2, 2, 1) # Shape: (2, 2, 1)
b = torch.randn(1, 2) # Shape: (1, 2)
# 过程解析:
# b 补全为 (1, 1, 2) -> 扩展为 (2, 2, 2)
# a 扩展为 (2, 2, 2)
# 结果 Shape: (2, 2, 2)
4. 矩阵乘法的特殊广播 (@)
矩阵乘法除了遵循上述规则,还必须满足矩阵乘法自身的硬性要求:
- 最后两个维度必须匹配:
A的列数 (shape[-1]) 必须等于B的行数 (shape[-2])。 - 前面的维度(Batch 维度)则遵循标准的广播规则。
示例:
A: (2, 3, 4) @ B: (4, 5)
B的 Batch 维度缺失,自动补全为(1, 4, 5)。B的 Batch 维度1扩展为2,变成(2, 4, 5)。- 执行批量矩阵乘法:
(2, 3, 4) @ (2, 4, 5)。 - 结果形状:
(2, 3, 5)。
五、 总结
- 随机函数是实验的燃料,熟练掌握
randn,rand,randint即可应对绝大多数场景。 - 广播机制是运算的润滑剂,理解“从右向左,1变多”的口诀,能让你写出更简洁、更高效的代码,避免手动写繁琐的
for循环或repeat操作。

1051

被折叠的 条评论
为什么被折叠?



