搞懂函数的区别的最好方法就是产看函数的底层实现。
首先可以在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实现的。
注:如有错误还请指出!