Day 48 - 随机函数与广播机制

一、 引言:张量运算的基石

在深度学习的世界里,我们每天都要和张量(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. 输入层[1, 3, 32, 32] (Batch, Channel, Height, Width)
    • 模拟一张 32x32 的彩色图片。
  2. 卷积层 (Conv2d)[1, 16, 32, 32]
    • 卷积核数量为 16,提取了 16 种特征。由于使用了 padding=1,长宽保持不变。
  3. 池化层 (MaxPool2d)[1, 16, 16, 16]
    • 长宽减半,保留最显著的特征,减少计算量。
  4. 展平 (Flatten)[1, 4096]
    • 将多维特征拉直成一维向量 (16 * 16 * 16 = 4096),准备送入全连接层。
  5. 全连接层 (Linear)[1, 128] -> [1, 10]
    • 逐步降维,最终输出 10 个类别的得分。
  6. Softmax[1, 10]
    • 将得分转换为概率分布,总和为 1。

技巧:在写代码时,多用 print(tensor.shape) 打印维度,或者使用 PyCharm 的调试功能,能帮你快速定位维度不匹配的错误。


四、 广播机制 (Broadcasting) 深度解析

广播机制是 PyTorch 中最“聪明”的特性。当两个张量形状不同时,它会自动“脑补”缺失的维度,让运算得以进行。

1. 核心规则

PyTorch 会从右向左逐个比较维度:

  1. 如果两个维度相等,没问题,继续比较下一个。
  2. 如果其中一个维度是 1,则该维度会被自动扩展(复制)成另一个张量的大小。
  3. 如果一个张量缺少某个维度,则视为在该维度前补 1
  4. 如果维度既不相等,也不为 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)

  1. B 的 Batch 维度缺失,自动补全为 (1, 4, 5)
  2. B 的 Batch 维度 1 扩展为 2,变成 (2, 4, 5)
  3. 执行批量矩阵乘法:(2, 3, 4) @ (2, 4, 5)
  4. 结果形状:(2, 3, 5)

五、 总结

  • 随机函数是实验的燃料,熟练掌握 randn, rand, randint 即可应对绝大多数场景。
  • 广播机制是运算的润滑剂,理解“从右向左,1变多”的口诀,能让你写出更简洁、更高效的代码,避免手动写繁琐的 for 循环或 repeat 操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值