Python训练营打卡Day48

发布于:2025-06-16 ⋅ 阅读:(14) ⋅ 点赞:(0)

知识点回顾:

  1. 随机张量的生成:torch.randn函数
  2. 卷积和池化的计算公式(可以不掌握,会自动计算的)
  3. 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 则可广播。
  2. 维度为 1 的轴会自动扩展至另一张量的对应维度大小。

四、拓展练习(建议自己动手实践)

  1. torch.randn生成形状为(5, 1, 28, 28)的张量,并与形状为(28, 28)的张量相加,观察广播效果。
  2. 计算卷积层输入为(64, 64),卷积核5×5,步长 2,填充 2 时的输出尺寸。
  3. 用 NumPy 复现 PyTorch 的广播加法案例,验证两者机制的一致性。

浙大疏锦行-CSDN博客https://blog.csdn.net/weixin_45655710?type=blog


网站公告

今日签到

点亮在社区的每一天
去签到