如何在 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)
像这样在 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_stepself.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)