我正在尝试实现一个简单的示例,即如何将跨透镜应用于我的语义分割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
永远不会完全输出零损失。