python打卡day39@浙大疏锦行
知识点回顾
- 图像数据的格式:灰度和彩色数据
- 模型的定义
- 显存占用的4种地方
- 模型参数+梯度参数
- 优化器参数
- 数据批量所占显存
- 神经元输出中间状态
- batchisize和训练的关系
1. 图像数据格式
- 灰度图像 :单通道,像素值范围通常0-255,形状为(H, W)或(1, H, W)
- 彩色图像 :三通道(RGB),形状为(3, H, W)或(H, W, 3)
2. 模型定义要点
- 由多个神经网络层组成(卷积层、全连接层等)
- 每层包含可训练参数(权重和偏置)
- 需要定义前向传播(forward)逻辑
3. 显存占用的4个主要部分
a. 模型参数+梯度参数
# 以PyTorch为例,每个参数会占用:
显存 = 参数数量 × 4字节(float32)
梯度占用相同大小的显存
b. 优化器参数
# 例如Adam优化器会为每个参数保存:
- 一阶动量(m)
- 二阶动量(v)
# 显存占用 = 参数数量 × 4 × 2
c. 数据批量所占显存
显存 = batch_size × 单样本数据量 × 4字节
d. 神经元输出中间状态
# 前向传播时各层的输出需要保存
# 用于反向传播计算梯度
显存 ≈ Σ(各层输出张量大小 × batch_size × 4)
4.batchisize和训练的关系
import torch
import torch.nn as nn
from torch.utils.data import DataLoader# 1. 定义简单模型
class SimpleModel(nn.Module):def __init__(self):super().__init__()self.fc = nn.Linear(10, 2) # 10维输入到2维输出# 2. 创建模拟数据集
data = torch.randn(1000, 10) # 1000个样本
targets = torch.randint(0, 2, (1000,))
dataset = torch.utils.data.TensorDataset(data, targets)# 3. 不同batch_size的影响对比
for batch_size in [1, 32, 1024]:loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)model = SimpleModel()optimizer = torch.optim.SGD(model.parameters(), lr=0.01)# 训练监控print(f"\nBatch Size: {batch_size}")for epoch in range(3):for x, y in loader:optimizer.zero_grad()output = model(x)loss = nn.CrossEntropyLoss()(output, y)loss.backward()optimizer.step()print(f"Epoch {epoch} Loss: {loss.item():.4f}", end='\r')
关键点说明:
1. batch_size=1 (随机梯度下降):
- 每个样本更新一次参数
- 损失波动剧烈(高方差)
- 适合在线学习场景
2. batch_size=32 (常用值):
- 平衡了梯度稳定性和计算效率
- 损失曲线相对平滑
3. batch_size=1024 (大批量):
- 梯度方向最稳定
- 需要更大的学习率(可用线性缩放规则)
- 可能需梯度累积(若显存不足)