损失函数
损失函数:衡量模型输出与真实标签的差异
- 损失函数
(Loss Function)
求一个样本的损失函数 - 代价函数
(Cost Functio)
求所有样本的平均值 - 目标函数
(Object Function)
=(Cost Functio)
+Regularization
nn.CrossEntropyLoss
功能:nn.LogSoftmax()
与nn.NLLLoss()
结合,进行交叉熵计算
主要参数:
weight
:各类别的loss
设置权值ignore_index
:忽略某个类别reduction
:计算模式,可分为none/sum/mean
none
逐个元素计算、sum
所有元素求和,返回标量、mean
加权平均,返回标量
# 定义损失函数
loss_f_none = nn.CrossEntropyLoss(weight=None, reduction='none')
loss_f_sum = nn.CrossEntropyLoss(weight=None, reduction='sum')
loss_f_mean = nn.CrossEntropyLoss(weight=None, reduction='mean')
# 前向传播之后计算损失函数
loss_none = loss_f_none(inputs, target)
loss_sum = loss_f_sum(inputs, target)
loss_mean = loss_f_mean(inputs, target)
weight
就是每个类别损失函数的权值
例如:
# 因为设置输入的时候,设置了两个类别0、1
# 这里weight的长度为2
weights = torch.tensor([1, 2], dtype=torch.float)
loss_f_none_w = nn.CrossEntropyLoss(weight=weights, reduction='none')
loss_f_sum = nn.CrossEntropyLoss(weight=weights, reduction='sum')
loss_f_mean = nn.CrossEntropyLoss(weight=weights, reduction='mean')
最后输出的损失函数的值:需要分别乘以相对应的权重值
如:最开始标签为[0, 1, 1]
,未加权重损失函数输出值[0.2, 0.3, 0.4]
。则最后的输出值为[0.2, 0.6, 0.8]
,然后最后计算mean
的时候,需要注意此时计算方式已经发生变化:(0.2+0.6+0.8)/ 5
nn.NLLLoss
功能:实现负对数似然函数中符号功能
主要参数:
weight
:各类别的loss
设置权值ignore_index
:忽略某个类别reduction
:计算方式,可为none/sum/mean
nn.BCELoss
功能:二分类交叉熵
注意事项:输入值取值在[0, 1]
主要参数:
weight
:各类别的loss
设置权值ignore_index
:忽略某个类别reduction
:计算模式,可分为none/sum/mean
此函数在使用的时候应该注意:输入的值是[0, 1]之间,因此针对输入应该增加一个sigmoid
,否则程序易出现错误。当然pytorch
也自带一个损失函数能够满足这个要求,即:nn.BGEWithLogitsLoss