基于PaddleDetction的标签平滑分析

标签平滑实现

1.正负样本

  • 正样本:学习的时候定义的正确的图片(某一类别的样本),因为学习的时候主要是侧重预测值和真实值差距大的对象进行学习,所以一定需要定义好哪些是正样本,哪些是负样本。

  • 负样本:就是不学习的部分图片。

    注:对于同一张图片可能对于“车”类是正样本,但是对于“行人”类就可能是负样本,因为图片中可能只有车没有人,所以只对车进行学习,对行人就不学习。

2.label smooth概念:

        if self.label_smooth:
            delta = min(1. / self.num_classes, 1. / 40)
            pos, neg = 1 - delta, delta #pos正样本,neg负样本
            # 1 for positive, 0 for negative
            tcls = pos * paddle.cast(
                tcls > 0., dtype=tcls.dtype) + neg * paddle.cast(
                    tcls <= 0., dtype=tcls.dtype)

        loss_cls = F.binary_cross_entropy_with_logits(
            pcls, tcls, reduction='none')
  • 标签平滑的目的:

    在使用正负样本进行学习时,常规的方法是直接将负样本抛弃,但是在训练数据不均衡的情况,直接将一些图片抛弃,会导致对于某一类图片可能正样本的数量很少,然后重复的对一些正样本进行学习,很快就会过拟合。所以标签平滑就是对于负样本也进行一个轻微的学习,来抑制过拟合。

  • 可参考博客:(33条消息) 标签平滑(label smoothing)_InceptionZ的博客-CSDN博客_标签平滑


)

    def _varifocal_loss(pred_score, gt_score, label, alpha=0.75, gamma=2.0):
        weight = alpha * pred_score.pow(gamma) * (1 - label) + gt_score * label
        loss = F.binary_cross_entropy(
            pred_score, gt_score, weight=weight, reduction='sum')
        return loss

易分辨样本、难分辨样本的含义

  • 在本损失函数中数次出现难分辨和易分辨的词语,那么何为易分辨、何为难分辨?
    其实这个区别隐藏在分类置信度上!
    通常将分类置信度接近1或接近0的样本称为易分辨样本,其余的称之为难分辨样本。换句话说,也就是我们有把握确认属性的样本称为易分辨样本,没有把握确认属性的样本称之为难分辨样本。
    比如在一张图片中,我们获得是人的置信度为0.9,那么我们很有把握它是人,所以此时认定该样本为易分辨样本。同样,获得是人的置信度为0.6,那么我们没有把握它是人,所以称该样本为难分辨样

  • facol_loss从样本分类难易程度出发,使loss聚焦于难分样本。

  • 相较于facol_loss,varifocal_loss,主要特点是正负样本非对称加权、突出正样本的主样本。

从paddle中导入PaddleDetection之后,再导入相关的类库就能调用label_smooth方法了~

posted @ 2022-06-13 11:11  Rogerssss  阅读(204)  评论(0)    收藏  举报