Pytorch loss 函数详解

reduce参数如果为True,计算结果“坍缩”,"坍缩"方法有两种:求和(size_average=False)与平均(size_average=True)

1. torch.nn.L1Loss   (MAE:Mean Absolute Error)

计算绝对值差的总和,输入输出的维度应该相同

loss = torch.nn.L1Loss(reduce=False, size_average=False)
loss(torch.tensor([1.,2.]),torch.tensor([3.,4.]))  # tensor([2., 2.])  3-1=2,4-2=2

loss = torch.nn.L1Loss(reduce=True, size_average=False)
loss(torch.tensor([1.,2.]),torch.tensor([3.,4.]))  # tensor(4.)  (3-1)+(4-2)=4

loss = torch.nn.L1Loss(reduce=True, size_average=True)
loss(torch.tensor([1.,2.]),torch.tensor([3.,4.]))  # tensor(2.)   [(3-1)+(4-2)]/2=2

常用于回归任务和简单的模型

2.torch.nn.MSELoss  (也可以说是L2loss,MSE:mean-square error)

也要求输入输出的形状相同

loss=(x-y)^{2}

loss = torch.nn.MSELoss(reduce=False, size_average=False)
loss(torch.tensor([1.,2.]),torch.tensor([3.,4.])) # tensor([4., 4.]) (3-1)^2=4

如果以输入为条件的目标数据正态分布在平均值附近,并且对异常值进行额外惩罚很重要,那么 MSE 非常适合使用。

3.torch.nn.SmoothL1Loss

它是L1 loss 与 L2 loss 的结合,在接近目标值的附近是L2 loss,相比L1更加平滑,在远离目标值的地方是L1,可以避免L2 loss的梯度爆炸

 4.torch.nn.BCELoss

以下loss适用于分类问题,使用交叉熵,其中p是真实概率分布,q为分真实分布,这里就是我们的预测分布

\sum_{k=1}^{N}p_{k}\cdot log_{2} \frac{1}{q_{k}}

a = torch.tensor([-4, 4, 4, 0])
x = torch.sigmoid(a)                         # tensor([0.0180, 0.9820, 0.9820, 0.5000])
y = torch.FloatTensor([1, 0, 1, 1])          # tensor([1., 0., 1., 1.])
loss = torch.nn.BCELoss(reduce=False, size_average=False)
#   -1  *log(0.0180)  =4.0181   
# -(1-0)*log(1-0.9820)=4.0181    
loss(x, y)                                   # tensor([4.0181, 4.0181, 0.0181, 0.6931])

 请关注上面代码的注释部分,可以看到我们的输入数据要经过Sigmoid函数将其映射为概率的形式,我们x的每一个值都代表预测当前例子是“1”的概率,比如看x的第二个数据是0.98,代表模型有98%的确定性把该输入分类为“1”(2%的确定性把该输入分类为“0”),但是真实标签是0,所以交叉熵的p为(1-0)=1,代表当前数据是0的真实分布为100%,那么q就是(1-0.98),所以-(1-0)*log(1-0.9820)=4.0181即为答案所求

5.torch.nn.BCEWithLogitsLoss

不需要再手动计算sigmoid    (log_sum_exp trick)

x = torch.FloatTensor([-4, 4, 4, 0])
#x = torch.sigmoid(a)
y = torch.FloatTensor([1, 0, 1, 1])
loss = torch.nn.BCEWithLogitsLoss(reduce=False, size_average=False)
loss(x, y)         #tensor([4.0181, 4.0181, 0.0181, 0.6931])

可见答案与BCELoss相同

6.torch.nn.NLLLoss

为选中的元素添加负号

nllloss = torch.nn.NLLLoss( reduce=False,reduction='sum')
predict = torch.Tensor([[2, 3, 1],
                        [3, 7, 9]])
label = torch.tensor([1, 2])
loss=nllloss(predict, label)
print(loss)     #tensor([-3., -9.])

predict中[2,3,1]代表是类别1的“可能性”是2,是类别2的“可能性”是3,是类别3的“可能性”是1,label第一个元素是1,取predict中第一个元素加负号(输入必须是batch_size的形式

7.torch.nn.CrossEntropyLoss

输入经过softmax,log后调用NLLLoss即是CrossEntropyLoss

nllloss = nn.NLLLoss()
predict = torch.Tensor([[2, 3, 1],
                        [3, 7, 9]])
predict = torch.log(torch.softmax(predict, dim=-1))
label = torch.tensor([1, 2])
nllloss(predict, label)
# output: tensor(0.2684)
cross_loss = nn.CrossEntropyLoss()

predict = torch.Tensor([[2, 3, 1],
                        [3, 7, 9]])
label = torch.tensor([1, 2])
cross_loss(predict, label)
# output: tensor(0.2684)

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值