PyTorch中的交叉熵损失函数nn.CrossEntropyLoss()

8

也许有人能在这里帮助我。我正在尝试计算我的网络输出的交叉熵损失。

print output
Variable containing:
1.00000e-02 *
-2.2739  2.9964 -7.8353  7.4667  4.6921  0.1391  0.6118  5.2227  6.2540     
-7.3584
[torch.FloatTensor of size 1x10]

并且需要的标签形式如下:
print lab
Variable containing:
x
[torch.FloatTensor of size 1]

x是一个介于0和9之间的整数。根据pytorch文档(http://pytorch.org/docs/master/nn.html)。

criterion = nn.CrossEntropyLoss()
loss = criterion(output, lab)

这应该可以运行,但不幸的是我收到了一个奇怪的错误。

TypeError: FloatClassNLLCriterion_updateOutput received an invalid combination of arguments - got (int, torch.FloatTensor, !torch.FloatTensor!, torch.FloatTensor, bool, NoneType, torch.FloatTensor, int), but expected (int state, torch.FloatTensor input, torch.LongTensor target, torch.FloatTensor output, bool sizeAverage, [torch.FloatTensor weights or None], torch.FloatTensor total_weight, int ignore_index)

有人能帮我吗?我真的很困惑,已经尽力想到所有可能有用的方法了。

最好的祝福


1
你能把“lab”转换成LongTensor并尝试一下吗? - Avijit Dasgupta
1个回答

7
请检查这段代码。
import torch
import torch.nn as nn
from torch.autograd import Variable

output = Variable(torch.rand(1,10))
target = Variable(torch.LongTensor([1]))

criterion = nn.CrossEntropyLoss()
loss = criterion(output, target)
print(loss)

这将会漂亮地打印出损失:
Variable containing:
 2.4498
[torch.FloatTensor of size 1]

谢谢,是的,问题在于目标变量必须是一个长整型张量,在我的代码中它是浮点型。谢谢! - Elias E.
嗨,如果我想实现二进制交叉熵损失,我该怎么做?谢谢。 - Rishabh Agrahari
output 的形状为 [1,10],而 target 的形状为 [1]。对于每个类别,交叉熵损失函数是 label * log(predicted)。因此,在计算损失时,Pytorch 是否会对 output 中的每个值都使用相同的目标标签(即这里的 1)? - Rishabh Agrahari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接