首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >交叉熵损失的人工计算

交叉熵损失的人工计算
EN

Stack Overflow用户
提问于 2021-08-10 12:55:47
回答 1查看 715关注 0票数 2

嗨,只是玩代码,我得到了意想不到的结果交叉熵损失权的实现。

代码语言:javascript
复制
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。

代码语言:javascript
复制
loss = F.cross_entropy(pred, label, weight=weights,reduction='mean')
> 4.7894

我手动实现了交叉熵损失代码,如下所示

代码语言:javascript
复制
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交叉熵函数相同的结果。但是有权值

代码语言:javascript
复制
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)。我可以粗略估计,我对减肥的理解有一些问题,但我无法找出造成这种差异的确切原因。有人能帮我处理这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-10 13:35:13

我发现了问题。很简单..。我不应该把重量之和除以。与wt.sum()除法(wt=one_hot*weight)相反,我得到了4.7894。

代码语言:javascript
复制
>>> wt = one_hot*weights
>>> loss = -(one_hot * log_prb * weights).sum(dim=1).sum() / wt.sum()
4.7894

分母只是与“相关”的重量值,而不是整体。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68727252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档