cosineannealinglr必须传入optimizer和t_max,t_max是step数而非epoch数;需在每个batch的optimizer.step()后调用scheduler.step();长训练推荐cosineannealingwarmrestarts;断点续训需同步恢复last_epoch。

PyTorch的CosineAnnealingLR怎么初始化才不会报错?
直接传入optimizer和T_max是必须的,漏掉任一参数会触发TypeError: __init__() missing 1 required positional argument。注意T_max不是总训练轮数,而是余弦退火一个完整周期对应的step数(通常设为len(train_loader) * num_epochs,即总迭代次数)。如果用torch.optim.lr_scheduler.StepLR那种按epoch更新的习惯去套,很容易误把T_max设成num_epochs,导致学习率在第1个epoch内就完成一次完整退火,后续全程卡在极小值。
常见初始化写法:
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(
optimizer,
T_max=50000, # 注意:这是step数,不是epoch数
eta_min=1e-6 # 可选,不设则默认为0
)
CosineAnnealingLR和train_step()怎么配合更新?
它只在每次optimizer.step()后调用scheduler.step()——不能放在epoch末尾,否则每epoch只调一次,退火节奏完全错乱。典型错误是写成for epoch in ...: train_epoch(); scheduler.step(),这会让学习率按epoch线性下降,失去余弦特性。
正确流程要点:
- 每个batch执行
loss.backward()→optimizer.step()→scheduler.step() - 如果用了
torch.cuda.amp.GradScaler,scheduler.step()必须放在scaler.step(optimizer)之后、scaler.update()之前 - 验证阶段不调用
scheduler.step(),否则会干扰退火节奏
重启机制CosineAnnealingWarmRestarts比CosineAnnealingLR好在哪?
原始CosineAnnealingLR只退火一次,到T_max后学习率恒为eta_min,对长训练任务不利。CosineAnnealingWarmRestarts通过T_0参数定义首个周期长度,之后周期按T_mult倍增(如T_0=10, T_mult=2,则周期为10→20→40…),每次重启时学习率重置为初始值,能持续激发模型跳出局部最优。
适用场景判断:
- 训练
epoch:用<code>CosineAnnealingLR足够 - 训练
>100epoch或loss明显震荡:优先试CosineAnnealingWarmRestarts -
T_0建议设为预计首次收敛所需的step数,不是拍脑袋定的epoch数
学习率曲线不对?检查last_epoch和verbose
加载断点后继续训练时,如果不显式设置last_epoch,调度器会从第0步重新开始,导致学习率突变。正确做法是保存和恢复时同步处理:
# 保存
torch.save({
'scheduler_state_dict': scheduler.state_dict(),
'last_epoch': scheduler.last_epoch
}, checkpoint_path)
<h1>加载</h1><p>checkpoint = torch.load(checkpoint_path)
scheduler.load_state_dict(checkpoint['scheduler_state_dict'])
scheduler.last_epoch = checkpoint['last_epoch'] # 关键!</p>
调试时开启verbose=True可打印每次step()后的lr值,比画图更快定位问题:
scheduler = CosineAnnealingLR(optimizer, T_max=1000, verbose=True)
真正容易被忽略的是:余弦退火对optimizer中多个参数组的支持有限——如果你给不同层设置了不同lr(如backbone用1e-4,head用1e-3),CosineAnnealingLR会统一按相同比例缩放所有组的学习率,无法单独控制各组退火节奏。需要精细调控时,得自己实现分组调度逻辑。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











