将PyTorch CrossEntropy方法应用于多类细分

时间:2019-02-13 22:13:02

标签: python conv-neural-network pytorch multiclass-classification cross-entropy

我正在尝试实现一个简单的示例,该示例如何将交叉熵应用于应该是我的语义分段CNN的输出。

使用pytorch格式,我将得到以下内容:

out = np.array([[
    [
        [1.,1, 1], 
        [0, 0, 0], 
        [0, 0, 0],
        [0, 0, 0]
    ],
    [
        [0, 0, 0],
        [1, 1, 1],
        [0, 0.,0],
        [0, 0, 0]
    ],
    [
        [0, 0, 0],
        [0, 0, 0],
        [1, 1, 1],
        [0, 0, 0]
    ],
    [
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [1, 1, 1]
    ]
]])

out = torch.tensor(out)

因此,我的输出在这里具有尺寸(1、4、4、3),是1个元素批次,4个通道代表4个可能的类,每个通道中有4个乘3的数据,存储该单元格来自其的概率课。

现在我的目标是这样的:

target=[
        [0, 0, 0],
        [1, 1, 1],
        [2, 2, 2],
        [3, 3, 3]
    ]

请注意,在“张量”张量中,每行来自该类的概率为1.0,从而与目标完美匹配。

例如,第三个通道(通道2)的整个第三行(行2)具有从该通道发出的1.0概率,而在任何其他位置为零;因此它也与目标第三行中的2匹配。

在这个示例中,我希望两个张量之间的损耗值最小。

我的问题是:

  • 在PyTorch中使用交叉熵损失方法的最佳方法是什么,以反映这种情况下目标与其预测之间没有区别?
  • 我应该从中得到什么损失值?

这是我到目前为止得到的:

import torch
from torch.nn import CrossEntropyLoss
import numpy as np

out = torch.Tensor(np.array([[
    [
        [1.,1, 1], 
        [0, 0, 0], 
        [0, 0, 0],
        [0, 0, 0]
    ],
    [
        [0, 0, 0],
        [1, 1, 1],
        [0, 0.,0],
        [0, 0, 0]
    ],
    [
        [0, 0, 0],
        [0, 0, 0],
        [1, 1, 1],
        [0, 0, 0]
    ],
    [
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [1, 1, 1]
    ]
]]))

target = torch.Tensor([[
    [0, 0, 0],
    [1, 1, 1],
    [2, 2, 2],
    [3, 3, 3]
]]).type('torch.LongTensor')

criterion = CrossEntropyLoss()
print(criterion(out, target))

输出:tensor(0.7437)

  • 我不应该期望它的值接近于cero吗?

提前谢谢

1 个答案:

答案 0 :(得分:1)

看看description of nn.CrossEntropyLoss function,您提供给out的预测nn.CrossEntropyLoss不会被视为类概率,而是被视为对数;损失函数使用soft maxout得出类别概率,因此nn.CrossEntropyLoss将永远不会输出精确的零损失。