python - 使用 Pytorch Lightning 时如何将指标(例如验证损失)记录到 TensorBoard?

标签 python machine-learning pytorch tensorboard pytorch-lightning

我正在使用 Pytorch Lightning 训练我的模型(在 GPU 设备上,使用 DDP)并且 TensorBoard 是 Lightning 使用的默认记录器。

我的代码设置为分别记录每个训练和验证步骤的训练和验证损失。

class MyLightningModel(pl.LightningModule):

    def training_step(self, batch):
        x, labels = batch
        out = self(x)
        loss = F.mse_loss(out, labels)
        self.log("train_loss", loss)
        return loss

    def validation_step(self, batch):
        x, labels = batch
        out = self(x)
        loss = F.mse_loss(out, labels)
        self.log("val_loss", loss)
        return loss

TensorBoard 在 SCALERS 选项卡中正确绘制了 train_lossval_loss 图表。但是,在 HPARAMS 选项卡的左侧栏中,只有 hp_metricMetrics 下可见。

enter image description here

但是,在 HPARAMS 选项卡的左侧栏中,只有 hp_metricMetrics 下可见。

enter image description here

我们如何将 train_lossval_loss 添加到 Metrics 部分?这样,我们将能够在 PARALLEL COORDINATES VIEW 中使用 val_loss 而不是 hp_metric

图像显示 hp_metric 且没有 val_loss: enter image description here

使用 Pytorch 1.8.1、Pytorch Lightning 1.2.6、TensorBoard 2.4.1

最佳答案

  • 您可以使用 self.logger.log_hyperparams 方法在 tensorboard 中记录超参数和指标。 (参见 pytorch lightning tensorboard docs)
  • 当且仅当您在 metric 中传递了相同的键名时,您通过 self.log 添加的值才会显示在 hparam 插件中。 (参见 pytorch tensorboard docs)

示例代码(full code):

class BasicModule(LightningModule):
    def __init__(self, lr=0.01):
        super().__init__()
        self.model = models.resnet18(pretrained=False)
        self.criterion = nn.CrossEntropyLoss()
        self.lr = lr
        self.save_hyperparameters()
        
        metric = MetricCollection({'top@1': Accuracy(top_k=1), 'top@5': Accuracy(top_k=5)})
        self.train_metric = metric.clone(prefix='train/')
        self.valid_metric = metric.clone(prefix='valid/')
    
    def on_train_start(self) -> None:
        # log hyperparams
        self.logger.log_hyperparams(self.hparams, {'train/top@1': 0, 'train/top@5': 0, 'valid/top@1': 0, 'valid/top@5': 0})
        return super().on_train_start()
    
    def training_step(self, batch, batch_idx, optimizer_idx=None):
        return self.shared_step(*batch, self.train_metric)

    def validation_step(self, batch, batch_idx):
        return self.shared_step(*batch, self.valid_metric)

    def shared_step(self, x, y, metric):
        y_hat = self.model(x)
        loss = self.criterion(y_hat, y)
        self.log_dict(metric(y_hat, y), prog_bar=True)
        return loss

if __name__ == '__main__':
    # default_hp_metric=False
    logger = loggers.TensorBoardLogger('', 'lightning_logs', default_hp_metric=False)
    trainer = Trainer(max_epochs=2, gpus='0,', logger=logger, precision=16)

关于python - 使用 Pytorch Lightning 时如何将指标(例如验证损失)记录到 TensorBoard?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66945431/

相关文章:

python - 在 Python 中手动生成 r 组合

python - 在 matplotlib 中绘制圆形轮廓线

machine-learning - 如何在机器学习中对不平衡数据进行建模?

python - Pytorch和多项式线性回归问题

pytorch - torch.cuda.device_count() 返回 2,但 torch.load(model_path, map_location ='cuda:1' ) 抛出错误

python - Keras 中的多个输出

python - 将列表元素放置在二维数组上的快速方法

python - 如何解决 Python sklearn 随机森林中的过拟合问题?

python - 我通过 open cv2 进行人脸检测时不断收到此错误

Pytorch 张量成对串联