如何在PyTorch Lightning中按Epoch记录并显示学习率?
PyTorch Lightning按Epoch记录学习率不显示的问题排查思路
我在PyTorch Lightning(PL)中尝试按Epoch记录学习率,但训练日志里始终看不到学习率指标。TensorFlow默认会自动记录学习率,我已经参照PL官方指南编写了代码,但问题依旧。以下是我的代码和训练日志示例,求解决思路:
我的实现代码
class FusionNetModule(pl.LightningModule): ... def configure_optimizers(self): optimizer = torch.optim.Adam(self.parameters(), lr=self.lr_rate) lr_scheduler = {'scheduler': torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.95), 'name': 'expo_lr'} return [optimizer], [lr_scheduler] def on_validation_epoch_end(self): # 手动记录学习率 lr = self.trainer.lr_scheduler_configs[0].scheduler.get_last_lr()[0] self.log('learning_rate', lr) ... ... # 学习率日志回调 lr_logger = LearningRateMonitor(logging_interval='epoch') trainer = pl.Trainer( logger=True, max_epochs=epochs, accelerator="gpu", devices=[gpu_id], callbacks=[lr_logger, early_stopping, checkpoint_callback, metric_logger, progressbar], default_root_dir=model_path)
训练日志示例
Epoch 101: 100%|#| 23/23 [00:06<00:00, 3.43it/s, v_num=102, val_loss=0.988, val_acc=0.768, train_loss=0.965, train_acc=0.752]
排查解决思路
让手动日志显示在进度条:你手动
log学习率时,默认prog_bar=False,所以进度条不会显示这个指标。修改log语句,加上prog_bar=True参数:self.log('learning_rate', lr, prog_bar=True, logger=True)匹配调度器名称与LearningRateMonitor:你给调度器设置了
name: 'expo_lr',LearningRateMonitor会自动记录这个名称对应的学习率,但需要确保回调的配置正确。可以先注释掉手动log的代码,仅保留LearningRateMonitor,看是否能在日志中看到expo_lr指标。明确调度器的更新周期:ExponentialLR默认需要按Epoch更新,但PL可能需要显式指定。在
lr_scheduler字典中添加interval参数,确保调度器按Epoch更新:lr_scheduler = { 'scheduler': torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.95), 'name': 'expo_lr', 'interval': 'epoch', # 明确按Epoch更新调度器 'frequency': 1 }检查回调顺序与冲突:如果同时使用
LearningRateMonitor和手动log,可能出现日志冲突。优先尝试单独使用LearningRateMonitor,确认是否能正常记录后,再考虑是否需要手动补充日志。确认进度条配置:如果进度条显示的指标过多,可能会隐藏学习率。可以调整
ProgressBar回调的refresh_rate,或者检查是否有其他回调限制了显示的指标数量。
内容的提问来源于stack exchange,提问作者Tae-Sung Shin
相关产品推荐
相关产品推荐

