首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试理解PyTorch中的cross_entropy损失

尝试理解PyTorch中的cross_entropy损失
EN

Stack Overflow用户
提问于 2019-07-23 18:00:29
回答 2查看 3.1K关注 0票数 3

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

代码语言:javascript
复制
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)

它输出以下内容:

代码语言:javascript
复制
tensor([0, 1, 2])
tensor(0.5514)

我不明白的是,假设我的输入与预期的输出相匹配,为什么损失不是0?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-23 18:12:05

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

代码语言:javascript
复制
probas = np.exp(logits)/np.sum(np.exp(logits), axis=1)

因此,pytorch在您的案例中使用的概率矩阵是:

代码语言:javascript
复制
[0.5761168847658291,  0.21194155761708547,  0.21194155761708547]
[0.21194155761708547, 0.5761168847658291, 0.21194155761708547]
[0.21194155761708547,  0.21194155761708547, 0.5761168847658291]
票数 1
EN

Stack Overflow用户

发布于 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)

代码:

代码语言:javascript
复制
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))

输出:

代码语言:javascript
复制
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损失函数的信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57161524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档