使用PyTorch中的交叉熵方法进行多类别分割

4

我正在尝试实现一个简单的示例,展示如何将交叉熵应用于我的语义分割卷积神经网络(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),表示一个元素批次,4个通道代表了4种可能的类别,每个通道中有4行3列的数据,存储了该单元格属于其类别的概率。

现在我的目标是这样的:

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

请注意,在“输出”张量中,每行都有1.0的概率来自于该类别,与目标完全匹配。例如,第三个通道(通道2)的整个第3行(第2行)具有1.0的概率,表示来自该通道,其他地方为零;因此,它也与目标中第三行的2相匹配。
通过这个例子,我期望两个张量之间的损失值最小。
我的问题是:
1.在PyTorch中使用交叉熵损失方法的最佳方式是什么,以反映该情况���目标和预测之间没有区别?
2.从这个案例中我应该期望什么样的损失值?
到目前为止,这就是我所得到的内容:
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)

  • 我是否应该期望一个更接近零的值?

谢谢您提前的帮助。

1个回答

2
请看nn.CrossEntropyLoss函数的描述,您提供给nn.CrossEntropyLoss的预测值out不被视为类概率,而是作为对数几率。损失函数使用softmaxout中推导出类概率,因此nn.CrossEntropyLoss永远不会输出完全为零的损失。"最初的回答"

请原谅我问一个愚蠢的问题,但您能详细解释一下答案吗?特别是关于如何在损失函数中处理logits。 - Inder
@Shai 我明白了。你知道在PyTorch中是否有合适的方法可以反映出我在示例中想要的'out'和'target'之间接近零损失值的正确方法吗?或者我应该转换我的“target”数据吗? - lvl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接