【问题标题】:How to get step-wise validation loss curve over all epochs in PyTorch Lightning如何在 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)

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

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

【问题讨论】:

    标签: pytorch-lightning


    【解决方案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 值。
    猜你喜欢
    • 1970-01-01
    • 2021-06-30
    • 2022-01-21
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2022-07-14
    • 2021-02-07
    相关资源
    最近更新 更多