DAY 48 超大力王爱学Python
通过以上实例,可以更直观地理解深度学习基础操作的底层逻辑,建议动手运行代码并观察输出,加深对广播机制和张量运算的理解。H_out = (224 + 2×1 - 3) // 1 + 1 = 224,输出尺寸保持不变。H_out = (32 - 2) // 2 + 1 = 16,输出尺寸减半至16×16。:生成符合标准正态分布(均值为 0,方差为 1)的随机张量。卷积和池化的计算公式(可以不掌握,会自
知识点回顾:
- 随机张量的生成:torch.randn函数
- 卷积和池化的计算公式(可以不掌握,会自动计算的)
- 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,则报错。
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])
四、结合广播机制与随机张量
任务:生成符合以下条件的张量并进行运算:
- 生成形状为(2, 3, 4)的随机张量T1(使用torch.randn);
- 生成形状为(4,)的随机张量T2,并与T1相乘;
- 解释广播过程。
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])
广播解析:
- T1形状为(2, 3, 4),T2形状为(4,);
- 从后往前比较维度:4=4,3与1兼容,2与1兼容;
- T2被扩展为(1, 1, 4),再与T1逐元素相乘,最终输出形状保持(2, 3, 4)。
-
通过以上实例,可以更直观地理解深度学习基础操作的底层逻辑,建议动手运行代码并观察输出,加深对广播机制和张量运算的理解。
更多推荐
所有评论(0)