我正在尝试实现一个简单的示例,展示如何将交叉熵应用于我的语义分割卷积神经网络(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)
- 我是否应该期望一个更接近零的值?
谢谢您提前的帮助。