这是一个非常新手的问题,但我正试图理解cross_entropy在Torch中的损失,所以我创建了以下代码:
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?
发布于 2019-07-23 18:12:05
这是因为您给交叉熵函数的输入不是您所做的那样的概率,而是要用以下公式转换为概率的对数:
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]发布于 2019-07-23 20:32:29
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损失函数的信息。
https://stackoverflow.com/questions/57161524
复制相似问题