应用Pytorch Crossentropy方法进行多类分割



我正在尝试实现一个简单的示例,即如何将跨透镜应用于我的语义分割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数据,以存储该单元格的可能性。班级。

现在我的目标就是这样:

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

请注意,在" out"张量中,每行的概率是从该类别中的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的价值吗?

预先感谢您

查看nn.CrossEntropyLoss函数的描述,您提供给nn.CrossEntropyLoss的预测out不是不被视为类概率,而是作为logits;损失函数使用SOFT MAX从out得出类概率,因此nn.CrossEntropyLoss永远不会完全输出零损失。

相关内容

  • 没有找到相关文章

最新更新