如何在 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 | 简要介绍