loss = F.cross_entropy()函数总结

CrossEntropyLoss: 交叉熵损失函数。交叉熵描述了两个概率分布之间的距离,当交叉熵越小说明二者之间越接近。

使用这个函数时应该特别注意out是没有经过softmax处理过的。因为调用F.cross_entropy函数时会通过log_softmax和nll_loss来计算损失,也就是说使用F.cross_entropy函数时,程序会自动先对out进行softmax,再log,最后再计算nll_loss。
换句话说,执行F.cross_entropy时,相当于执行以下代码:

soft_out = F.softmax(out)
log_soft_out = torch.log(soft_out)
loss = F.nll_loss(log_soft_out, y)

其中softmax()是做归一化,容易理解。

torch.log是以自然数e为底的对数函数。
例如:

torch.log(torch.Tensor([1]) =0
torch.log(torch.Tensor([2.7])=0.999

NLLLoss,个人理解:感觉像是把 target 转换成 one-hot 编码,然后与 input 点乘得到的结果,再取相反数。
例如:

input = [-0.1187, 0.2110, -0.7463]
target = [1]
loss = F.nll_loss(input, target)
结果 :loss = -0.2110

用pytorch的一段代码验证CrossEntropyLoss:

data = torch.randn(2, 5)
print('log_soft:', log_soft, '\n')

target = torch.tensor([1, 2])
entropy_out = F.cross_entropy(data, target)
print('nll_out:', nll_out)

打印输出结果为:

log_soft: tensor([[-1.7060, -2.9883, -0.4641, -2.7265, -2.6049], [-3.5031, -0.9056, -1.0348, -1.7917, -3.1319]])
entropy_out: tensor(2.0116)

其中2.0116 = (2.9883+1.0348)/2。

总结:F.cross_entropy()的计算过程为:如果得到的输出为一个概率的分布,data值越大的,经过log_softmax计算,让所有数的和等于1,并且取值范围在0-1之间,接着通过torch.log处理,所有的数都变成了负值,原始数值越大,得到的负值也越大,那么绝对值就越小。nll可以看做在标签位置求出这个绝对值,从结果可以看出,如果预测与标签匹配,这个值小,不匹配,这个值大。因此我们训练的目的是让nll_loss变小。

参考资料:
https://blog.csdn.net/weixin_38314865/article/details/104487587
https://blog.csdn.net/jacke121/article/details/82747195
https://blog.csdn.net/ndhuaerfeifei/article/details/106034348
https://blog.csdn.net/m0_38133212/article/details/88087206
https://www.cnblogs.com/leebxo/p/11913939.html

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值