如何在PyTorch Lightning中从logger提取每个epoch的损失和准确率
提取PyTorch Lightning全量训练日志的三种可行方案
方案1:训练前新增CSVLogger同步记录(操作最简单)
PyTorch Lightning自带CSV日志记录器,和你当前用的TensorBoardLogger可以同时使用,训练过程会自动把所有指标按行写入csv文件,不需要事后解析二进制日志:
from pytorch_lightning.loggers import CSVLogger # 保留原有TensorBoardLogger,新增CSVLogger tb_logger = pl.loggers.TensorBoardLogger(name=f'ssl-{lr}-{num_epoch}', save_dir='lightning_logs') csv_logger = CSVLogger(name=f'ssl-{lr}-{num_epoch}', save_dir='lightning_logs') trainer = pl.Trainer(progress_bar_refresh_rate=20, gpus=1, max_epochs = max_epoch, logger = [tb_logger, csv_logger], # 传入logger列表即可 )
训练完成后,在csv_logger.log_dir路径下可以找到metrics.csv文件,直接用pandas读取就能拿到所有epoch、step的全量指标:
import pandas as pd df = pd.read_csv("lightning_logs/你的实验目录/metrics.csv")
方案2:已完成训练仅存tfevents日志,直接解析现有文件
不需要重新训练,用TensorBoard自带的日志解析工具就能读取已有的tfevents文件提取全量指标:
该方法需要已安装tensorboard依赖
from tensorboard.backend.event_processing.event_accumulator import EventAccumulator # 填入trainer.logger.log_dir返回的日志目录下的tfevents文件路径 log_path = "lightning_logs/ssl-xxx-xx/events.out.tfevents.xxxxxx" event_acc = EventAccumulator(log_path) event_acc.Reload() # 查看所有已记录的指标名称 print(event_acc.Tags()['scalars']) # 输出示例:['train_loss', 'train_acc', 'val_loss', 'val_acc', 'epoch'] # 提取单个指标的全量记录,比如验证集准确率 val_acc_events = event_acc.Scalars('val_acc') # 转成(step, 指标值)的列表 val_acc_list = [(e.step, e.value) for e in val_acc_events]
方案3:自定义Callback全程记录(灵活度最高)
如果有特殊的记录需求,可以自己实现回调类,在每个epoch结束时自动保存当前指标:
from pytorch_lightning.callbacks import Callback class FullMetricRecorder(Callback): def __init__(self): self.full_metrics = [] def on_epoch_end(self, trainer, pl_module): # 把当前epoch的指标转成普通数值后存入列表 epoch_data = {k: v.item() if hasattr(v, 'item') else v for k, v in trainer.logged_metrics.items()} self.full_metrics.append(epoch_data) # 训练时把回调传入Trainer recorder = FullMetricRecorder() trainer = pl.Trainer( # 其他参数不变 callbacks=[recorder] ) # 训练结束直接读取全量指标 print(recorder.full_metrics)
内容的提问来源于stack exchange,提问作者Wakame
相关产品推荐
相关产品推荐

