这是一个非常新手的问题,但是我试图绕过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?
答案 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]