pytorch nn.CrossEntropyLoss() 中的交叉熵损失

Posted

技术标签:

【中文标题】pytorch nn.CrossEntropyLoss() 中的交叉熵损失【英文标题】:Cross entropy loss in pytorch nn.CrossEntropyLoss() 【发布时间】:2018-04-14 09:06:25 【问题描述】:

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

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)

谁能帮助我?我真的很困惑,几乎尝试了所有我能想象到的有用的方法。

最好的

【问题讨论】:

你能把 'lab' 转换成 LongTensor 试试吗? 【参考方案1】:

请检查此代码

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]

【讨论】:

谢谢,是的,问题是目标变量必须是 Long 张量,并且在我的代码中是 float 类型。谢谢! 嗨,如果我想实现二元交叉熵损失怎么办?我怎样才能做到这一点?谢谢 output 的形状是 [1,10]target[1]。每个类的交叉熵损失为label * log (predicted)。那么,在损失计算期间,Pytorch 是否对output 中的每个值使用相同的目标标签(此处为 1)?

以上是关于pytorch nn.CrossEntropyLoss() 中的交叉熵损失的主要内容,如果未能解决你的问题,请参考以下文章

pytorch 中的常用矩阵操作

Pytorch Note1 Pytorch介绍

pytorch_geometric + MinkowskiEngine

1. PyTorch是什么?

1. PyTorch是什么?

对比学习:《深度学习之Pytorch》《PyTorch深度学习实战》+代码