【发布时间】: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