Pytorch: 关于 torch.nn.CrossEntropyLoss

创建于 2017-04-14  ·  3评论  ·  资料来源: pytorch/pytorch

关于torch.nn.CrossEntropyLoss,
我正在学习 pytorch,并参加 anpr 项目
(https://github.com/matthewearl/deep-anpr,
http://matthewearl.github.io/2016/05/06/cnn-anpr/)
作为练习,将其移植到 pytorch 平台。

有一个问题,我使用 nn.CrossEntropyLoss() 作为损失函数:
标准=nn.CrossEntropyLoss()

模型的 output.data 是:
1.00000e-02 *
-2.5552 2.7582 2.5368 ... 5.6184 1.2288 -0.0076
-0.7033 1.3167 -1.0966 ... 4.7249 1.3217 1.8367
-0.7592 1.4777 1.8095 ... 0.8733 1.2417 1.1521
-0.1040 -0.7054 -3.4862 ... 4.7703 2.9595 1.4263
[torch.FloatTensor 大小为 4x253]

和targets.data是:
1 0 0 ... 0 0 0
1 0 0 ... 0 0 0
1 0 0 ... 0 0 0
1 0 0 ... 0 0 0
[torch.DoubleTensor 大小为 4x253]

当我打电话时:
损失=标准(输出,目标)
发生错误,信息是:
TypeError:FloatClassNLLCriterion_updateOutput 收到无效的参数组合 - 得到(int,torch.FloatTensor,torch.DoubleTensor,torch.FloatTensor,bool,NoneType,torch.FloatTensor),但预期(int state,torch.FloatTensor 输入,torch.LongTensor 目标, torch.FloatTensor 输出, bool sizeAverage, [torch.FloatTensor weights or None], torch.FloatTensor total_weight)

'expected torch.LongTensor','got torch.DoubleTensor',但是如果我将目标转换为 LongTensor:
torch.LongTensor(numpy.array(targets.data.numpy(),numpy.long))
调用 loss=criterion(output,targets),错误是:
RuntimeError:/data/users/soumith/miniconda2/conda-bld/pytorch-0.1.10_1488752595704/work/torch/lib/THNN/generic/ClassNLLCriterion.c:20 不支持多目标

我的最后一个练习是mnist,一个来自pytorch的例子,我做了一点修改,batch_size是4,损失函数:
loss = F.nll_loss(输出,标签)
输出数据:
-2.3220 -2.1229 -2.3395 -2.3391 -2.5270 -2.3269 -2.1055 -2.2321 -2.4943 -2.2996
-2.3653 -2.2034 -2.4437 -2.2708 -2.5114 -2.3286 -2.1921 -2.1771 -2.3343 -2.2533
-2.2809 -2.2119 -2.3872 -2.2190 -2.4610 -2.2946 -2.2053 -2.3192 -2.3674 -2.3100
-2.3715 -2.1455 -2.4199 -2.4177 -2.4565 -2.2812 -2.2467 -2.1144 -2.3321 -2.3009
[torch.FloatTensor 大小为 4x10]

标签.数据:
8
6
0
1
[torch.LongTensor 大小为 4]

标签,对于输入图像,必须是单个元素,在上例中,有 253 个数字,而在 'mnist' 中,只有一个数字,输出的形状与标签不同。

我查看了 tensorflow 手册,tf.nn.softmax_cross_entropy_with_logits,
'Logits 和标签必须具有相同的形状 [batch_size, num_classes] 和相同的 dtype(float32 或 float64)。

那么,在这种情况下我可以使用 pytorch,或者我该怎么做?
很多想法

最有用的评论

我不会说 TF 文档是了解 PyTorch API 的最佳场所🙂我们并没有尝试与 TF 兼容,并且我们的 CrossEntropyLoss 接受类索引向量(这使其运行速度比使用时快得多1-热向量)。 如果您确实需要,在两种表示之间进行转换应该很简单。

请注意,我们仅将 GitHub 问题用于错误报告。 如果您有任何问题,请在我们的论坛上提问。

所有3条评论

http://pytorch.org/docs/nn.html#crossentropyloss
交叉熵损失形状:
输入:(N,C) 其中 C = 类数
目标:(N),其中每个值为 0 <= targets[i] <= C-1

我还有其他选择吗?

我不会说 TF 文档是了解 PyTorch API 的最佳场所🙂我们并没有尝试与 TF 兼容,并且我们的 CrossEntropyLoss 接受类索引向量(这使其运行速度比使用时快得多1-热向量)。 如果您确实需要,在两种表示之间进行转换应该很简单。

请注意,我们仅将 GitHub 问题用于错误报告。 如果您有任何问题,请在我们的论坛上提问。

谢谢,将 one-hot 类编码矩阵转换为整数向量为我解决了 CrossEntropyLoss 问题!

此页面是否有帮助?
0 / 5 - 0 等级