知识点回顾:
- 随机张量的生成:torch.randn函数
- 卷积和池化的计算公式(可以不掌握,会自动计算的)
- pytorch的广播机制:加法和乘法的广播机制
ps:numpy运算也有类似的广播机制,基本一致
作业:自己多借助ai举几个例子帮助自己理解即可
一、随机张量生成:torch.randn
函数
torch.randn
用于生成符合标准正态分布(均值为 0,方差为 1) 的随机张量,形状由输入参数指定。
import torch
# 生成1个形状为(3, 4)的随机张量
tensor_3x4 = torch.randn(3, 4)
print("(3, 4)张量:\n", tensor_3x4)
# 生成1个形状为(2, 3, 5)的三维随机张量
tensor_2x3x5 = torch.randn(2, 3, 5)
print("\n(2, 3, 5)张量:\n", tensor_2x3x5.shape) # 输出形状
输出效果:
(3, 4)张量:
tensor([[ 0.1234, -0.5678, 0.9101, -0.2345],
[-0.6789, 0.3456, -0.7890, 0.4567],
[ 0.8901, -0.2345, 0.5678, -0.9101]])
(2, 3, 5)张量:
torch.Size([2, 3, 5])
示例 2:结合设备与数据类型
# 生成在GPU上的float32类型张量(需设备支持)
if torch.cuda.is_available():
gpu_tensor = torch.randn(2, 2, device='cuda', dtype=torch.float32)
print("GPU张量:\n", gpu_tensor)
# 生成均值为0,方差为2的正态分布张量(通过变换实现)
tensor_custom = torch.randn(2, 2) * 2 # 方差扩大2倍
print("\n自定义方差张量:\n", tensor_custom)
二、卷积和池化的计算公式(理解逻辑)
虽然框架会自动计算,但理解原理有助于调参!
1. 卷积层计算公式
输入参数:
- 输入尺寸:Win×Hin
- 卷积核大小:K×K
- 步长(Stride):S
- 填充(Padding):P
输出尺寸:
Wout=⌊SWin+2P−K⌋+1Hout=⌊SHin+2P−K⌋+1
示例:卷积计算
- 输入图像:28×28
- 卷积核:3×3,步长 = 1,填充 = 1
- 输出尺寸:⌊128+2×1−3⌋+1=28×28
2. 池化层计算公式(以最大池化为例)
输入参数:
- 输入尺寸:Win×Hin
- 池化核大小:K×K
- 步长:S(通常等于K,即不重叠池化)
输出尺寸:
Wout=⌊SWin−K⌋+1Hout=⌊SHin−K⌋+1
示例:最大池化计算
- 输入特征图:28×28
- 池化核:2×2,步长 = 2
- 输出尺寸:⌊228−2⌋+1=14×14
三、PyTorch 广播机制(含 NumPy 类比)
广播机制允许不同形状的张量进行运算,通过自动扩展维度实现维度对齐。
1. 加法广播示例
场景:给张量的每个通道添加相同的偏置
import torch
import numpy as np
# PyTorch示例
feature_map = torch.randn(2, 3, 224, 224) # [batch, channel, H, W]
bias = torch.randn(3) # [channel]
output = feature_map + bias # 自动沿H/W维度广播
print("PyTorch广播加法形状:")
print(f"输入特征图:{feature_map.shape}")
print(f"偏置:{bias.shape}")
print(f"输出:{output.shape}\n")
# NumPy类比
np_feature = np.random.randn(2, 3, 224, 224)
np_bias = np.random.randn(3)
np_output = np_feature + np_bias
print("NumPy广播加法形状:")
print(f"输入特征图:{np_feature.shape}")
print(f"偏置:{np_bias.shape}")
print(f"输出:{np_output.shape}")
核心逻辑:
bias
从(3,)
扩展为(1, 3, 1, 1)
,再与feature_map
相加。
2. 乘法广播示例
场景:对张量的每个空间位置乘以不同的权重
# PyTorch示例
weight = torch.randn(1, 3, 1, 1) # [1, channel, 1, 1]
scaled_feature = feature_map * weight # 沿batch/H/W广播
print("\nPyTorch广播乘法形状:")
print(f"权重:{weight.shape}")
print(f"缩放后特征图:{scaled_feature.shape}")
# NumPy类比(逻辑一致,代码略)
广播规则总结:
- 从后往前对比维度,若维度相等或其中一个为 1 则可广播。
- 维度为 1 的轴会自动扩展至另一张量的对应维度大小。
四、拓展练习(建议自己动手实践)
- 用
torch.randn
生成形状为(5, 1, 28, 28)
的张量,并与形状为(28, 28)
的张量相加,观察广播效果。 - 计算卷积层输入为
(64, 64)
,卷积核5×5
,步长 2,填充 2 时的输出尺寸。 - 用 NumPy 复现 PyTorch 的广播加法案例,验证两者机制的一致性。