如何在 PyTorch Lightning 中获得所有时期的逐步验证损失曲线

Posted

技术标签:

【中文标题】如何在 PyTorch Lightning 中获得所有时期的逐步验证损失曲线【英文标题】:How to get step-wise validation loss curve over all epochs in PyTorch Lightning 【发布时间】:2021-05-23 05:13:04 【问题描述】:

在 PyTorch Lighting 中将我的验证丢失记录在 validation_step() 中时,如下所示:

def validation_step(self, batch: Tuple[Tensor, Tensor], _batch_index: int) -> None:
    inputs_batch, labels_batch = batch

    outputs_batch = self(inputs_batch)
    loss = self.criterion(outputs_batch, labels_batch)

    self.log('loss (valid)', loss.item())

然后,我得到一个 epoch-wise 损失曲线:

如果我想要逐步损失曲线,我可以设置on_step=True

def validation_step(self, batch: Tuple[Tensor, Tensor], _batch_index: int) -> None:
    inputs_batch, labels_batch = batch

    outputs_batch = self(inputs_batch)
    loss = self.criterion(outputs_batch, labels_batch)

    self.log('loss', loss.item(), on_step=True)

这会导致每个时期的逐步损失曲线:

我怎样才能获得所有时期的单一图表?当我运行数千个时期的训练时,这会变得混乱。

【问题讨论】:

【参考方案1】:

您在初始化记录器时似乎做错了什么。是否定义如下:

logger = TensorBoardLogger("tb_logs", name="my_model")

请注意,on_step 会修改您的标签,这是它们显示为单独图像的原因之一。

你可以使用 on_step 代替:

self.logger.experiment.add_scalar('name',metric)

如果您希望绘图 x 轴显示时期数而不是步数,您可以将记录器放置在 validation_epoch_end(self, outputs) 内。

def validation_epoch_end(self, outputs):
   avg_loss = torch.stack([x["val_loss"] for x in outputs]).mean()
   self.logger.experiment.add_scalar('loss',avg_loss, self.current_epoch)

【讨论】:

我没有初始化我的记录器。 AFAIK 默认记录器保证是 TensorBoard 记录器。但我想绕过self.log() 并直接通过self.logger.experiment 访问记录器是一种解决方案。太糟糕了self.log() 太有限了。 self.log() 提供了对所有框架的日志数据的简单访问,但是如果我们访问实验,我们可以获得框架支持的每个独特功能(e.i tensorboard)。我建议初始化记录器。还要检查 API。这是链接,因为 pytorch-lightning 界面非常糟糕。 pytorch-lightning.readthedocs.io/en/latest/… 根据我的经验,需要使用self.logger.experiment.add_scalars()(带有s)来获得所需的行为。 add_scalar()(没有 s)没有按预期绘制 x 值。

以上是关于如何在 PyTorch Lightning 中获得所有时期的逐步验证损失曲线的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PyTorch Lightning 中编写多个训练设置

如何禁用 PyTorch-Lightning 记录器的日志记录?

如何在 Pytorch Lightning 中使用 numpy 数据集

如何从Pytorch 到 Pytorch Lightning | 简要介绍

如何在树莓派 pi3 中安装模块 pytorch_lightning.metrics

如何在 Pytorch Lightning 微调之前测试模型?