我正在尝试实现一个简单的示例,该示例如何将交叉熵应用于应该是我的语义分段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个乘3的数据,存储该单元格来自其的概率课。
现在我的目标是这样的:
target=[
[0, 0, 0],
[1, 1, 1],
[2, 2, 2],
[3, 3, 3]
]
请注意,在“张量”张量中,每行来自该类的概率为1.0,从而与目标完美匹配。
例如,第三个通道(通道2)的整个第三行(行2)具有从该通道发出的1.0概率,而在任何其他位置为零;因此它也与目标第三行中的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)
提前谢谢
答案 0 :(得分:1)
看看description of nn.CrossEntropyLoss
function,您提供给out
的预测nn.CrossEntropyLoss
不会被视为类概率,而是被视为对数;损失函数使用soft max从out
得出类别概率,因此nn.CrossEntropyLoss
将永远不会输出精确的零损失。