【问题标题】:torchmetrics represent uncertainty火炬计量代表不确定性
【发布时间】:2022-07-18 17:41:54
【问题描述】:

我正在使用 torchmetrics 来计算多标签分类设置中的 F1 分数、召回率、精度和准确率等指标。使用随机初始化权重,softmax 输出(即预测)可能看起来像这样,批量大小为 8:

import torch
y_pred = torch.tensor([[0.1944, 0.1931, 0.2184, 0.1968, 0.1973],
                       [0.2182, 0.1932, 0.1945, 0.1973, 0.1968],
                       [0.2182, 0.1932, 0.1944, 0.1973, 0.1969],
                       [0.2182, 0.1931, 0.1945, 0.1973, 0.1968],
                       [0.2184, 0.1931, 0.1944, 0.1973, 0.1968],
                       [0.2181, 0.1932, 0.1941, 0.1970, 0.1976],
                       [0.2183, 0.1932, 0.1944, 0.1974, 0.1967],
                       [0.2182, 0.1931, 0.1945, 0.1973, 0.1968]])

使用正确的标签(one-hot 编码):

y_true = torch.tensor([[0, 0, 1, 0, 1],
                       [0, 1, 0, 0, 1],
                       [0, 1, 0, 0, 1],
                       [0, 0, 1, 1, 0],
                       [0, 0, 1, 1, 0],
                       [0, 1, 0, 1, 0],
                       [0, 1, 0, 1, 0],
                       [0, 0, 1, 0, 1]])

我可以通过使用 argmax 来计算指标:

import torchmetrics
torchmetrics.functional.f1_score(y_pred.argmax(-1), y_true.argmax(-1))

输出:

tensor(0.1250)

第一个预测恰好是正确的,而其余的都是错误的。但是,没有一个预测概率高于 0.3,这意味着该模型通常对预测不确定。我想对此进行编码并说 f1 分数应该为 0.0,因为没有一个预测概率高于 0.3 阈值。


torchmetrics 或 sklearn 库可以做到这一点吗?

这是常见的做法吗?

【问题讨论】:

    标签: pytorch metrics


    【解决方案1】:

    在将预测传递给torchmetrics之前,您需要对预测进行阈值化

            t0, t1, mask_gt = batch
            mask_pred = self.forward(t0, t1)
            
            loss = self.criterion(mask_pred.squeeze().float(), mask_gt.squeeze().float())
    
            mask_pred = torch.sigmoid(mask_pred).squeeze()
            mask_pred = torch.where(mask_pred > 0.5, 1, 0)
    
            # integers to comply with metrics input type
            mask_pred = mask_pred.long()
            mask_gt = mask_gt.long()
    
            f1_score = self.f1(mask_pred, mask_gt)
            precision = self.precision_(mask_pred, mask_gt)
            recall = self.recall(mask_pred, mask_gt)
            jaccard = self.jaccard(mask_pred, mask_gt)
    

    定义的torchmetrics

            self.f1 = F1Score(num_classes=2, average='macro', mdmc_average='samplewise')
            self.recall = Recall(num_classes=2, average='macro', mdmc_average='samplewise')
            self.precision_ = Precision(num_classes=2, average='macro', mdmc_average='samplewise')  # self.precision exists in torch.nn.Module. Hence '_' symbol
            self.jaccard = JaccardIndex(num_classes=2)
    

    【讨论】:

      猜你喜欢
      • 2017-02-23
      • 2022-07-20
      • 1970-01-01
      • 2019-01-19
      • 2018-09-11
      • 1970-01-01
      • 2011-02-16
      • 2018-04-29
      • 2020-07-06
      相关资源
      最近更新 更多