对于二分类问题,使用softmax或者sigmoid,在实验结果上到底有没有区别(知乎上相关问题讨论还不少)。最近做的相关项目也用到了这一块,从结果上来说应该是没什么区别,但是在模型上还是存在一定差异性的(可以应用于多模型融合、在相关比赛项目当中还是可以使用的)。相关知识和代码总结如下。
以下主要分为4个部分:交叉熵损失、二分类交叉熵损失、Focal loss及二分类Focal loss
1. CE_loss
import torch.nn.functional as F
F.cross_entropy是log_softmax和nll_loss的组合,log_softmax就是log和softmax的组合,nll_loss为:
注意,这里面包括了将output进行Softmax操作的,所以直接输入output即可。其中还包括将label转成one-hot编码,所以直接输入label。该函数限制了target的类型为torch.LongTensor。label_tgt = make_variable(torch.ones(feat_tgt.size(0)).long())可在后边直接.long()。其output,label的shape可以不一致。
里面有一个weight参数,默认为0,是为解决类别样本不平衡问题的,对于含有样本非常多的某一类别,可以使其在loss中wei