一 十七个损失函数(前三个貌似常用些,后面的没怎么见过)
1)L1loss
功能:计算输出与输入之差的绝对值,可返回一个标量或者一个tensor类型;
class torch.nn.L1Loss(size_average=None,reduce=None)
# reduce:填写bool型,当为True时:返回值为标量;反之,返回tensor类型
#当size_average=True时,返回loss的平均值;当size_average=False,返回各样本的Loss之和;
2)MSELoss (又称L2loss)
如何选择L1loss和L2loss损失函数?
答:看异常数据值了,若把异常数据值当作数据处理,那么用L1;若为了把异常数据剔除出来,那么用L2;
功能:计算输出与输入之差的平方,可选返回一个标量或者一个tensor类型;
class torch.nn.MSELoss(size_average=None,reduce=None,reduction='elementwise_mean')
#各个分量的填写见L1Loss
3)crossEntropyLoss(又称对数似然函数)
将输入经过softmax激活函数之后,再计算其与target的交叉熵损失。即方法将nn.LogSoftmax()和nn.NLLLoss()进行了结合。严格意义上的交叉熵损失函数应该是nn.NLLLoss()
class torch.nn.CrossEntropyLoss(weight=None,size_average=None,ignore_index=-100,reduce=None,reduction='elementwise_mean')
#weight(tensor):给每个类别的Loss设置权值,必须为float型的tensor;
#ignore_index(int):忽略某一类别,不计算其loss,除的时候分母也不会统计那一类,总之,这一列压根就不会出现在任何地方;
为啥引入softmax?
因为交叉熵——反映俩概率分布的差异; 神经网络的输出——为向量
softmax作用——将向量转化为0-1之间的概率分布
4)NLLloss (此方法可由交叉熵损失函数法代替)
应用场景:多用于多分类任务,但是输入之前需要对输入进行log_softmax函数激活,即将输入转化为概率分布的形式,并求取对数
class torch.nn.NLLloss(weight=None,size_average=None,ignore_index=-100,reduce=None,reduction='elementwise_mean')
5)PoissionNllloss (此方法用于target为泊松分布的任务)
class torch.nn.Possionloss(long_input=True,full=False,size_average=None,eps=1e-8,reduce=None,reduction='elementwise_mean')
#long_input:[True]:(公式为:loss(input,target)=exp(input)-target*input)/ [Flase]:(公式为:loss(input,target)=input-# target*log(input+eps))
#full:是否计算所有的loss
#eps(float):增加的一个修正项
6)KLDIVLoss
功能:计算输入与目标的KL散度
KL散度:相对熵,用于描述两个概率分布之间的差异
class torch.nn.KLDVLoss(size_average=None,reduce=None,reduction='elementwise_mean')
想要获得真正的KL散度,需进行如下操作:
1)reduce=True;size_average=False
2)计算得到的Loss要对batch求取平均;
7) BCELoss (交叉熵损失函数的特例)
class torch.nn.BCEILoss(weight=None,size_average=None,reduce=None,reduction='elementwise_mean')
8)BCEWithLogitsLoss(sigmoid函数与BCELoss损失函数叠加使用)
class torch.nn.BCEWithLogitsLoss(weight=None,size_average=None,reduce=None,reduction='elementwise_mean',pos_weight=None)
#pos_weight:正样本的权重;p>1:提高召回率;p<1:提高精确度
9) MarginRankingLoss (计算两个向量间的相似度)
class torch.nn.MarginRankingLoss(margin=0,size_average=None,reduce=None,reduction='elementwise_mean')
当两个向量间的距离大于margin时,loss为正,反之,loss为0.
10) HingeEmbeddingLoss (用于半监督学习或者非线性映射的时候用)
11) MultiLabelMarginLoss (用于样本属于多个类别时的分类任务。例:样本1属于类A,类B,不属于类C和类D)
12) SmoothL1Loss(优化L1Loss,解决了L1Loss在0处不可导的问题)
class torch.nn.SmoothL1Loss(size_average=None,reduce=None,reduction='elementwise_mean')