知識點回顧
- 圖像數據的格式:灰度和彩色數據
- 模型的定義
- 顯存占用的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 (大批量):
? ?
? ?- 梯度方向最穩定
? ?- 需要更大的學習率(可用線性縮放規則)
? ?- 可能需梯度累積(若顯存不足)