试图了解PyTorch中的交叉熵损失

时间:2019-07-23 10:00:29

标签: python machine-learning pytorch

这是一个非常新手的问题,但是我试图绕过Torch中的cross_entropy损失,所以我创建了以下代码:

x = torch.FloatTensor([
                        [1.,0.,0.]
                       ,[0.,1.,0.]
                       ,[0.,0.,1.]
                       ])

print(x.argmax(dim=1))

y = torch.LongTensor([0,1,2])
loss = torch.nn.functional.cross_entropy(x, y)

print(loss)

输出以下内容:

tensor([0, 1, 2])
tensor(0.5514)

我不知道给定我的输入与预期输出匹配的原因,为什么损失不为0?

2 个答案:

答案 0 :(得分:1)

torch.nn.functional.cross_entropy函数将log_softmax(softmax后跟一个对数)和nll_loss(负对数似然损失)组合到一个 函数,即等效于F.nll_loss(F.log_softmax(x, 1), y)

代码:

x = torch.FloatTensor([[1.,0.,0.],
                       [0.,1.,0.],
                       [0.,0.,1.]])
y = torch.LongTensor([0,1,2])

print(torch.nn.functional.cross_entropy(x, y))

print(F.softmax(x, 1).log())
print(F.log_softmax(x, 1))

print(F.nll_loss(F.log_softmax(x, 1), y))

输出:

tensor(0.5514)
tensor([[-0.5514, -1.5514, -1.5514],
        [-1.5514, -0.5514, -1.5514],
        [-1.5514, -1.5514, -0.5514]])
tensor([[-0.5514, -1.5514, -1.5514],
        [-1.5514, -0.5514, -1.5514],
        [-1.5514, -1.5514, -0.5514]])
tensor(0.5514)

here中了解有关torch.nn.functional.cross_entropy损失函数的更多信息。

答案 1 :(得分:0)

这是因为您提供给交叉熵函数的输入不是像您所做的那样的概率,而是要通过以下公式转换为概率的对数:

probas = np.exp(logits)/np.sum(np.exp(logits), axis=1)

因此pytorch在您的情况下将使用的概率矩阵为:

[0.5761168847658291,  0.21194155761708547,  0.21194155761708547]
[0.21194155761708547, 0.5761168847658291, 0.21194155761708547]
[0.21194155761708547,  0.21194155761708547, 0.5761168847658291]