F.cross_entropy和F.nll_loss交叉熵以

拆解cross_entropy= -log(softmax),nnl是负号(多batch取均值)

raw–>softmax–>log–>nll(negative log loss)-log(s)

torch.log,logp=torch.nn.LogSoftmax(dim-1),p=torch.nn.Softmax

https://blog.csdn.net/ll1042668699/article/details/103753702
https://blog.csdn.net/qq_22210253/article/details/85229988
不用one_hot, 而是直接用类别序号为target如batch是3个样本,4人类的话,label直接可以为【0,2,2,1】
因为nnl是直接取log(softmax)向量再取负号,求均值。
https://baijiahao.baidu.com/s?id=1636737136973859154&wfr=spider&for=pc

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

首先可以在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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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

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

注:如有错误还请指出!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值