明天呐 2024-07-09 18:44 采纳率: 0%
浏览 21

如何提高召回率从而提高F1得分?

利用深度学习做遥感变化检测,以孪生网络和UNet++为baseline作改进,但随着训练推进,精确度不断上升,召回率却不断下降,即F1得分也会降低,这是什么原因?过拟合还是其他问题?如何解决?
训练到第35轮左右的精确度、召回率、F1得分如下图所示

img


训练到第70轮左右的精确度、召回率、F1得分如下图所示

img

如果从修改损失函数下手,定向提升网络召回率,该怎么修改,是不是可以对focal loss做了一些改进完成这个需求,比如增加w0,w1,损失权重,就是让模型认为,假阴性(实际存在变化,但被错误地判定为没有变化的情况)的惩罚比假阳性的惩罚更大,参数gamma, alpha,w0, w1应该怎么设置,才能提升召回率,即减少漏检率,请帮忙修改以下损失函数

class FocalLoss(nn.Module):
    def __init__(self, gamma=0, alpha=None, size_average=True,w0, w1):
        super(FocalLoss, self).__init__()
        self.gamma = gamma
        self.alpha = alpha
        # 调整正负样本权重
        self.w0 = 
        self.w1 = 
        if isinstance(alpha, (float, int)):
            self.alpha = torch.Tensor([alpha, 1-alpha])
        if isinstance(alpha, list):
            self.alpha = torch.Tensor(alpha)
        self.size_average = size_average

    def forward(self, input, target):
        if input.dim() > 2:
            # N,C,H,W => N,C,H*W
            input = input.view(input.size(0), input.size(1), -1)

            # N,C,H*W => N,H*W,C
            input = input.transpose(1, 2)

            # N,H*W,C => N*H*W,C
            input = input.contiguous().view(-1, input.size(2))


        target = target.view(-1, 1)
        logpt = F.log_softmax(input,dim=1)
        logpt = logpt.gather(1, target)
        logpt = logpt.view(-1)
        pt = Variable(logpt.data.exp())

        if self.alpha is not None:
            if self.alpha.type() != input.data.type():
                self.alpha = self.alpha.type_as(input.data)
            at = self.alpha.gather(0, target.data.view(-1))
            logpt = logpt * Variable(at)

        loss = -1 * (1-pt)**self.gamma * logpt

        if self.size_average:
            return loss.mean()
        else:
            return loss.sum()

除了修改损失函数外,还有什么办法能够解决。

  • 写回答

1条回答 默认 最新

  • 阿里嘎多学长 2024-07-09 19:01
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    根据您提供的信息,您正在使用深度学习进行遥感变化检测,并且遇到了精确度提高而召回率下降的问题,这导致 F1 分数降低。F1 分数是精确度和召回率的调和平均值,所以两者都需要平衡。下面是一些建议和解决方案:

    分析训练过程

    首先,分析训练过程中精确度和召回率的变化趋势。您提供的两张图片显示了在不同训练轮次下模型的性能。通常,精确度提高而召回率降低可能意味着模型对正样本的预测越来越准确,但可能错过了一些实际的正样本。

    调整 FocalLoss 损失函数

    Focal Loss 是为了解决类别不平衡问题而设计的,它通过增加对难以分类样本的损失权重来提高模型性能。以下是一些调整建议:

    1. 调整 gamma 参数gamma 参数控制了模型对难以分类样本的关注程度。增加 gamma 值可以增加对假阴性的惩罚。

    2. 设置 alpha 参数alpha 参数用于平衡正负样本的权重。如果正样本较少,可以增加正样本的权重。

    3. 添加 w0w1 参数:您提到了添加 w0w1 来调整损失权重,这可以是一个很好的尝试。w0 可以设置为一个较大的值,以增加对假阴性的惩罚;w1 可以设置为一个较小的值或负值,以减少对假阳性的惩罚。

    修改 FocalLoss 类

    以下是根据您的需求修改后的 FocalLoss 类的示例代码:

    import torch
    import torch.nn as nn
    import torch.nn.functional as F
    
    class FocalLoss(nn.Module):
        def __init__(self, gamma=2, alpha=0.25, w0=1, w1=0.5, size_average=True):
            super(FocalLoss, self).__init__()
            self.gamma = gamma
            self.alpha = alpha
            self.w0 = w0
            self.w1 = w1
            if isinstance(alpha, (float, int)):
                self.alpha = torch.Tensor([1-alpha, alpha])
            elif isinstance(alpha, list):
                self.alpha = torch.Tensor(alpha)
            self.size_average = size_average
    
        def forward(self, input, target):
            # 省略了输入和目标的维度调整代码...
    
            # 计算 Focal Loss
            loss = - self.alpha * (1-pt) ** self.gamma * logpt * self.w0
            loss += - (1 - self.alpha) * pt ** self.gamma * logpt * self.w1
    
            if self.size_average:
                return loss.mean()
            else:
                return loss.sum()
    

    其他解决方案

    除了修改损失函数,还可以尝试以下方法:

    • 数据增强:通过数据增强技术增加训练样本的多样性,有助于模型学习到更鲁棒的特征。
    • 模型架构调整:考虑调整模型架构,如增加卷积层或使用不同的激活函数。
    • 超参数调整:除了损失函数参数外,其他超参数如学习率、批大小等也可能影响模型性能。

    结论

    提高召回率和 F1 分数需要综合考虑模型的损失函数、数据、架构和超参数。通过逐步调整和实验,您可以找到最适合您任务的解决方案。

    参考链接

    请注意,这些链接仅供参考,具体实现可能需要根据您的具体需求进行调整。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月9日