kaggle比赛技巧之标签平滑(Pseudo labels)

首先附上kaggle鲸鱼比赛第一名大神的比赛经验:
https://www.kaggle.com/c/humpback-whale-identification/discussion/82366

https://github.com/earhian/Humpback-Whale-Identification-1st-/blob/master/train.py

今天老板找谈话,哎呀,督促了下最近比赛进度的事情,也说了下怎么快速水一篇论文,让我找找CCF C类的会议,赶紧水了毕业。。

   进入正题,kaggle比赛中的一个重要技巧是标签平滑,它主要用于分类任务中:如图像分类/识别(image level classification),语义分割(pixel level classification)或者是物体检测中的分类(patch level classification),只要是loss损失函数中涉及到cross entropy,都可以应用到标签平滑的策略。

    标签平滑的场景:比如对应于image segmentation task,图像中的某些像素点被认为是文字的类别,剩下的像素点被认为是背景类别,但是对于某些背景类别的像素点,会很像前景类别,通过卷积层的特征提取和全连接层输出之后,很大的概率把它分类成前景,但是它的ground truth 类别是背景,通过cross entropy计算损失函数,则用C表示当前数据集中的类别总数,y_i表示ground truth类别,而p_i表示网络模型预测出来的类别,则对于现在的背景类别而言,将其预测为前景的概率很大(假设是0.9999),则预测为背景(即正确类别)的概率为0.00001,则再取log对数值之后将会是非常大的负数值,这将会导致loss函数数值产生较大的波动和震荡,故而在这种情况下需要进行标签平滑,具体实现代码为:

     F.nll_loss(torch.log(F.softmax(prediction,dim=1)+1e-3)),即在计算出概率值之后加上平滑因子1e-3,防止计算log时产生很大的负数值,再进行正常的cross_entropy操作

kaggle比赛技巧之标签平滑(Pseudo labels)_第1张图片

你可能感兴趣的:(pytorch)