知识点回顾:

  1. 随机张量的生成:torch.randn函数
  2. 卷积和池化的计算公式(可以不掌握,会自动计算的)
  3. pytorch的广播机制:加法和乘法的广播机制

ps:numpy运算也有类似的广播机制,基本一致

作业:自己多借助ai举几个例子帮助自己理解即可

一、随机张量生成:torch.randn 函数

函数作用:生成符合标准正态分布(均值为 0,方差为 1)的随机张量。

语法格式:torch.randn(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

  • *size:指定张量的形状(如(2,3)表示 2 行 3 列的矩阵)。
import torch

# 实例1:生成2×3的标准正态分布随机张量
tensor1 = torch.randn(2, 3)
print("2×3随机张量:\n", tensor1)

# 实例2:生成三维张量(批次大小为4,通道数为3,尺寸为5×5)
tensor2 = torch.randn(4, 3, 5, 5)
print("4×3×5×5随机张量形状:", tensor2.shape)

# 实例3:指定数据类型为float32
tensor3 = torch.randn(2, 2, dtype=torch.float32)
print("float32类型张量:\n", tensor3)

输出说明

  • 每次运行torch.randn会生成不同的随机数,但数值分布符合标准正态分布。
  • 常用于初始化模型参数(如权重矩阵),因为正态分布能让参数值更均匀地分布在 0 附近,有助于模型收敛。
二、卷积和池化的计算公式(自动计算场景)

虽然实际使用中 PyTorch 会自动计算卷积和池化的输出形状,但理解原理有助于调参:

1. 卷积层输出形状计算

假设输入形状为(N, C_in, H_in, W_in),卷积核参数为:

  • 卷积核大小K, paddingP, strideS, 输出通道数C_out。

输出形状

  • 高度 / 宽度:H_out = (H_in + 2P - K) // S + 1
  • 最终形状:(N, C_out, H_out, W_out)

实例

输入图像尺寸为224×224,使用3×3卷积核,stride=1,padding=1:

H_out = (224 + 2×1 - 3) // 1 + 1 = 224,输出尺寸保持不变。

2. 池化层输出形状计算

以最大池化为例,参数为:

  • 池化核大小K, strideS, paddingP。

输出形状

  • 高度 / 宽度:H_out = (H_in + 2P - K) // S + 1
  • 通道数与输入一致。

实例

输入尺寸为32×32,使用2×2池化核,stride=2:

H_out = (32 - 2) // 2 + 1 = 16,输出尺寸减半至16×16。

三、PyTorch 的广播机制(加法和乘法)

广播机制允许不同形状的张量进行运算,通过自动扩展维度使形状兼容,核心规则:

1. 广播规则
  1. 从后往前(右到左)比较各维度大小;
  1. 若维度相等或其中一个为 1,则可广播;
  1. 若维度不等且不为 1,则报错。
2. 加法与乘法实例

实例 1:二维张量加法(形状兼容)

# 张量A:形状(3, 1),张量B:形状(1, 4)
A = torch.tensor([[1], [2], [3]])
B = torch.tensor([[1, 2, 3, 4]])
C = A + B  # 等价于A广播为(3,4),B广播为(3,4)
print("A+B结果:\n", C)
# 输出:
# [[2, 3, 4, 5],
#  [3, 4, 5, 6],
#  [4, 5, 6, 7]]

实例 2:三维张量乘法(广播扩展维度) 

# 张量X:形状(2, 1, 3),张量Y:形状(3,)
X = torch.tensor([[[1], [2], [3]], [[4], [5], [6]]])
Y = torch.tensor([2, 3, 4])
Z = X * Y  # X广播为(2,3,3),Y广播为(2,3,3)
print("X*Y形状:", Z.shape)  # 输出:torch.Size([2, 3, 3])
四、结合广播机制与随机张量

任务:生成符合以下条件的张量并进行运算:

  1. 生成形状为(2, 3, 4)的随机张量T1(使用torch.randn);
  1. 生成形状为(4,)的随机张量T2,并与T1相乘;
  1. 解释广播过程。
    T1 = torch.randn(2, 3, 4)
    T2 = torch.randn(4)
    T3 = T1 * T2  # T2广播为(1, 1, 4),再与T1运算
    print("T3形状:", T3.shape)  # 输出:torch.Size([2, 3, 4])

    广播解析

  2. T1形状为(2, 3, 4),T2形状为(4,);
  3. 从后往前比较维度:4=4,3与1兼容,2与1兼容;
  4. T2被扩展为(1, 1, 4),再与T1逐元素相乘,最终输出形状保持(2, 3, 4)。
  5. 通过以上实例,可以更直观地理解深度学习基础操作的底层逻辑,建议动手运行代码并观察输出,加深对广播机制和张量运算的理解。

 





@浙大疏锦行




 

Logo

更多推荐