SGD优化器贯穿Faster R-CNN的全模型
统一管理所有可训练参数的更新,而非作用于某个局部模块。
一、全局视角: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同步更新
浙公网安备 33010602011771号