图像分割之常用损失函数-Focal Loss

哈喽大家好 ! 我是唐宋宋宋,很荣幸与您相见!!

focal loss的整体理解:

目前目标检测的算法大致分为两类,One Stage 、Two Stage

One Stage:主要指类似YOLO、SGD等这样不需要region proposal,直接回归的检测算法,这类算法检测速度很快,但是精度准确率不如使用Two stage的模型。

two Stage:主要指FastRCNN、RFCN等这样需要region proposal的检测算法。这类算法可以达到很高的进度,但是同时检测速度较慢。虽然可以减少Proposal的数量或者降低输入图像的分辨率等方式达到提速。

作者提出Focal loss的出发点也是希望one-stage detector可以达到two-stage detector的准确率,同时不影响原有的速度。


focal loss 是一种处理样本分类不均衡的损失函数,它侧重的点是根据样本分辨的难易程度给样本对应的损失添加权重,即给容易区分的样本添加较小的权重α1,给难分辨的样本添加较大的权重α2那么,损失函数的表达式可以写为:L = α 1 × L 易 区 分 + α 2 × L 难 区 分 。

因为α1小而α2 大,那么上述的损失函数中 L 难区分区分主导损失函数,也就是将损失函数的重点集中于难分辨的样本上,对应损失函数的名称:focal loss。


注意:Focal Loss损失函数容易受到噪声的干扰。也就是说训练集中标注的信息尽量不要出现错误的情况,否则Focal Loss损失函数就会针对那些标注错误的样本进行重点学习,使得模型的训练效果越来越差。因为根据Focal Loss损失函数的原理,它会重点关注困难样本,而此时如果我们将某个样本标注错误,那么该样本对于网络来说就是一个"困难样本",所以Focal Loss损失函数就会重点学习这些"困难样本",导致模型训练效果越来越差


这里介绍下focal loss的两个重要性质:1、当一个样本被分错的时候,pt是很小的(请结合公式2,比如当y=1时,p要小于0.5才是错分类,此时pt就比较小,反之亦然),因此调制系数就趋于1,也就是说相比原来的loss是没有什么大的改变的。当pt趋于1的时候(此时分类正确而且是易分类样本),调制系数趋于0,也就是对于总的loss的贡献很小。2、当γ=0的时候,focal loss就是传统的交叉熵损失,当γ增加的时候,调制系数也会增加。

focal loss的两个性质算是核心,其实就是用一个合适的函数去度量难分类和易分类样本对总的损失的贡献。

代码附下:

    n, c, h, w = inputs.size()
    nt, ht, wt = target.size()
    if h != ht and w != wt:
        inputs = F.interpolate(inputs, size=(ht, wt), mode="bilinear", align_corners=True)

    temp_inputs = inputs.transpose(1, 2).transpose(2, 3).contiguous().view(-1, c)
    temp_target = target.view(-1)

    logpt  = -nn.CrossEntropyLoss(weight=cls_weights, ignore_index=num_classes, reduction='none')(temp_inputs, temp_target)
    pt = torch.exp(logpt)
    if alpha is not None:
        logpt *= alpha
    loss = -((1 - pt) ** gamma) * logpt
    loss = loss.mean()

    return loss

引用了这些博住的知识点,我进行了一个总结,在这里表示感谢。

https://blog.csdn.net/cxkyxx/article/details/108455805

https://blog.csdn.net/m0_56192771/article/details/124270842

猜你喜欢

转载自blog.csdn.net/m0_64524798/article/details/129553545
今日推荐