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

How to get step-wise validation loss curve over all epochs in PyTorch Lightning

像这样在 PyTorch Lightning 中记录我在 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)

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

我怎样才能得到一个涵盖所有时期的单一图表? 当 运行 我对数千个时期的训练变得混乱时。

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

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)