统一管理所有可训练参数的更新,而非作用于某个局部模块。
一、全局视角:SGD管理哪些参数?
Python
# Faster R-CNN可训练参数总览
model = FasterRCNN(backbone=ResNet50(), # 包含 conv1~conv5_x, BN层rpn=RPNHead(), # 包含分类/回归分支的卷积roi_heads=RoIHeads(), # 包含全连接层、分类器
)# 所有参数由同一个SGD优化器管理
optimizer = optim.SGD(params=[# 1. Backbone参数 (C1~C5卷积){'params': model.backbone.parameters()},# 2. RPN参数 (anchor分类/回归){'params': model.rpn.parameters()},# 3. RoI Head参数 (检测头){'params': model.roi_heads.parameters()},],lr=0.02,momentum=0.9,weight_decay=1e-4
)
一句话 :SGD的
step() 每次更新整个Faster R-CNN的权重,从 backbone 底层卷积到 RoI Head 的分类器。二、训练流程中的SGD位置
完整训练循环
Python
for epoch in range(12):for images, targets in dataloader:# 1. 前向传播 (所有模块共同参与)# - Backbone提取特征# - RPN生成proposals# - RoI Head预测类别/框loss_dict = model(images, targets)losses = sum(loss_dict.values()) # 总损失# 2. 反向传播 (计算所有模块的梯度)optimizer.zero_grad()losses.backward()# ↓# 梯度已存储在每个参数的 .grad 属性中# model.backbone.conv1.weight.grad# model.rpn.conv.weight.grad# model.roi_heads.box_predictor.weight.grad# 3. 参数更新 (SGD一步更新所有模块)optimizer.step()# ↓# 所有参数同步更新:# backbone.conv1.weight -= lr * grad# rpn.conv.weight -= lr * grad# roi_heads.box_predictor.weight -= lr * grad
SGD作用位置图:
损失函数↓ (backward)
梯度传播到每个参数↓
├─→ Backbone (ResNet) ← SGD更新
├─→ RPN Head ← SGD同步更新
└─→ RoI Head ← SGD同步更新