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同步更新
posted @ 2025-12-06 17:35  yinghualeihenmei  阅读(0)  评论(0)    收藏  举报