1. pytorch中常用的损失函数列举
pytorch中的nn模块提供了很多可以直接使用的loss函数, 比如MSELoss(), CrossEntropyLoss(), NLLLoss() 等
官方链接: https://pytorch.org/docs/stable/_modules/torch/nn/modules/loss.html
损失函数 | 名称 | 适用场景 |
---|---|---|
torch.nn.MSELoss() | 均方误差损失 | 回归 |
torch.nn.L1Loss() | 平均绝对值误差损失 | 回归 |
torch.nn.CrossEntropyLoss() | 交叉熵损失 | 多分类 |
torch.nn.NLLLoss() | 负对数似然函数损失 | 多分类 |
torch.nn.NLLLoss2d() | 图片负对数似然函数损失 | 图像分割 |
torch.nn.KLDivLoss() | KL散度损失 | 回归 |
torch.nn.BCELoss() | 二分类交叉熵损失 | 二分类 |
torch.nn.MarginRankingLoss() | 评价相似度的损失 | |
torch.nn.MultiLabelMarginLoss() | 多标签分类的损失 | 多标签分类 |
torch.nn.SmoothL1Loss() | 平滑的L1损失 | 回归 |
torch.nn.SoftMarginLoss() | 多标签二分类问题的损失 |
多标签二分类 |
2. 比较CrossEntropyLoss() 和NLLLoss()
(1). CrossEntropyLoss():
torch.nn.CrossEntropyLoss(weight=None, # 1D张量,含n个元素,分别代表n类的权重,样本不均衡时常用
size_average=None,
ignore_index=-100,
reduce=None,
reduction='mean' )
参数:
weight: 1D张量,含n个元素,分别代表n类的权重,样本不均衡时常用, 默认为None.
计算公式:
weight = None时:
weight ≠ None时:
输入:
output: 网络未加softmax的输出
target: label值(0,1,2 不是one-hot)
代码:
loss_func = CrossEntropyLoss(weight=torch.from_numpy(np.array([0.03,0.05,0.19,0.26,0.47])).float().to(device) ,size_average=True)
loss = loss_func(output, target)
(2). NLLLoss():
torch.nn.NLLLoss(weight=None,
size_average=None,
ignore_index=-100,
reduce=None,
reduction='mean')
输入:
output: 网络在logsoftmax后的输出
target: label值(0,1,2 不是one-hot)
代码:
loss_func = NLLLoss(weight=torch.from_numpy(np.array([0.03,0.05,0.19,0.26,0.47])).float().to(device) ,size_average=True)
loss = loss_func(output, target)
(3). 二者总结比较:
总之, CrossEntropyLoss() = softmax + log + NLLLoss() = log_softmax + NLLLoss(), 具体等价应用如下:
####################---CrossEntropyLoss()---#######################
loss_func = CrossEntropyLoss()
loss = loss_func(output, target)
####################---Softmax+log+NLLLoss()---####################
self.softmax = nn.Softmax(dim = -1)
x = self.softmax(x)
output = torch.log(x)
loss_func = NLLLoss()
loss = loss_func(output, target)
####################---LogSoftmax+NLLLoss()---######################
self.log_softmax = nn.LogSoftmax(dim = -1)
output = self.log_softmax(x)
loss_func = NLLLoss()
loss = loss_func(output, target)
补充:常用损失函数用法小结之Pytorch框架
在用深度学习做图像处理的时候,常用到的损失函数无非有四五种,为了方便Pytorch使用者,所以简要做以下总结
1)L1损失函数
预测值与标签值进行相差,然后取绝对值,根据实际应用场所,可以设置是否求和,求平均,公式可见下,Pytorch调用函数:nn.L1Loss
2)L2损失函数
预测值与标签值进行相差,然后取平方,根据实际应用场所,可以设置是否求和,求平均,公式可见下,Pytorch调用函数:nn.MSELoss
3)Huber Loss损失函数
简单来说就是L1和L2损失函数的综合版本,结合了两者的优点,公式可见下,Pytorch调用函数:nn.SmoothL1Loss
4)二分类交叉熵损失函数
简单来说,就是度量两个概率分布间的差异性信息,在某一程度上也可以防止梯度学习过慢,公式可见下,Pytorch调用函数有两个,一个是nn.BCELoss函数,用的时候要结合Sigmoid函数,另外一个是nn.BCEWithLogitsLoss()
5)多分类交叉熵损失函数
也是度量两个概率分布间的差异性信息,Pytorch调用函数也有两个,一个是nn.NLLLoss,用的时候要结合log softmax处理,另外一个是nn.CrossEntropyLoss
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。