pytorch中F.cross_entropy和F.nll_loss的区别

搞懂函数的区别的最好方法就是产看函数的底层实现。

首先可以在pytorch中分别点击进入函数内部,看他们的具体实现。
1、F.cross_entropy的内部实现是:
在这里插入图片描述
并且cross_entropy函数的返回值是:在这里插入图片描述
2、F.nll_loss的内部实现是:
在这里插入图片描述
3、结论
这里先上结论。这两种损失的区别在于input上的操作,对于cross_entropy来说,他首先会对input进行log_softmax操作,然后再将log_softmax(input)的结果送入nll_loss;而nll_loss的input就是input。
NLLLoss 的 输入 是一个对数(log)概率(softmax)向量和一个目标标签. 它不会为我们计算对数概率. 适合网络的最后一层是log_softmax.
损失函数 nn.CrossEntropyLoss() 与 NLLLoss() 相同, 唯一的不同是它为我们去做 log_softmax.

4、实验验证

input = torch.tensor([[[[0.5546, 0.1304, 0.9288],
                        [0.6879, 0.3553, 0.9984],
                        [0.1474, 0.6745, 0.8948]],
		               [[0.8524, 0.2278, 0.6476],
                        [0.6203, 0.6977, 0.3352],
                        [0.4946, 0.4613, 0.6882]]]])
target = torch.tensor([[[0, 0, 0],
                       [0, 0, 0],
                       [0, 0, 1]]])
# cross_entropy的实现               
loss = F.cross_entropy(input, target)
print(loss)

# 利用nll_loss实现cross_entropy
input = F.softmax(input, dim=1)
input = torch.log(input)
# input = F.log_softmax(input, dim=1)  # 上面的两行代码和这个是等价的
loss = F.nll_loss(input, target)
print(loss)

输出:
在这里插入图片描述

5、总结:
利用nll_loss实现的cross_entropy和pytorch中自带的cross_entropy的结果一致,证明函数的却别仅在input上的处理,F.cross_entropy也是基于F.nll_loss实现的。

注:如有错误还请指出!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值