嗨,只是玩代码,我得到了意想不到的结果交叉熵损失权的实现。
pred=torch.tensor([[8,5,3,2,6,1,6,8,4],[2,5,1,3,4,6,2,2,6],[1,1,5,8,9,2,5,2,8],[2,2,6,4,1,1,7,8,3],[2,2,2,7,1,7,3,4,9]]).float()
label=torch.tensor([[3],[7],[8],[2],[5]],dtype=torch.int64)
weights=torch.tensor([1,1,1,10,1,6,1,1,1],dtype=torch.float32)在这类样本变量下,毕道尔的交叉熵损失为4.7894。
loss = F.cross_entropy(pred, label, weight=weights,reduction='mean')
> 4.7894我手动实现了交叉熵损失代码,如下所示
one_hot = torch.zeros_like(pred).scatter(1, label.view(-1, 1), 1)
log_prb = F.log_softmax(pred, dim=1)
loss = -(one_hot * log_prb).sum(dim=1).mean()这种实现在没有权值的情况下,给出了与pytorch交叉熵函数相同的结果。但是有权值
one_hot = torch.zeros_like(pred).scatter(1, label.view(-1, 1), 1)
log_prb = F.log_softmax(pred, dim=1)
loss = -(one_hot * log_prb)*weights.sum(dim=1).sum()/weights.sum()
> 3.9564它给出了不同的损失值与吡炬模块(4.7894)。我可以粗略估计,我对减肥的理解有一些问题,但我无法找出造成这种差异的确切原因。有人能帮我处理这个问题吗?
发布于 2021-08-10 13:35:13
我发现了问题。很简单..。我不应该把重量之和除以。与wt.sum()除法(wt=one_hot*weight)相反,我得到了4.7894。
>>> wt = one_hot*weights
>>> loss = -(one_hot * log_prb * weights).sum(dim=1).sum() / wt.sum()
4.7894分母只是与“相关”的重量值,而不是整体。
https://stackoverflow.com/questions/68727252
复制相似问题