【问题标题】:Apply a PyTorch CrossEntropy method for multiclass segmentation应用 PyTorch CrossEntropy 方法进行多类分割
【发布时间】:2019-07-07 21:09:30
【问题描述】:

我正在尝试实现一个简单的示例,说明如何将交叉熵应用于我的语义分割 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 x 3 个数据,存储该单元格来自它的概率类。

现在我的目标是这样的:

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

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

例如,第三个通道(通道 2)的整个第 3 行(第 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 的值吗?

提前谢谢你

【问题讨论】:

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


    【解决方案1】:

    查看description of nn.CrossEntropyLoss function,您提供给nn.CrossEntropyLoss 的预测out被视为类概率,而是被视为logits;损失函数使用 soft maxout 导出类概率,因此 nn.CrossEntropyLoss 永远不会输出完全为零的损失。

    【讨论】:

    • 请原谅我问了一个愚蠢的问题,但你能否详细说明一下答案,特别是关于损失函数中 logits 是如何处理的
    • @Shai 我明白了。您是否知道 PyTorch 中的正确方法,它实际上反映了我在示例中打算的“输出”和“目标”之间的接近于零的损失值?或者我应该转换我的“目标”数据吗?
    猜你喜欢
    • 2022-11-15
    • 2020-07-11
    • 2021-05-18
    • 2020-08-29
    • 2020-03-29
    • 2021-05-09
    • 1970-01-01
    • 2020-04-07
    • 2021-11-13
    相关资源
    最近更新 更多