pytorch中CrossEntropyLoss中weight的问题

本文探讨了在使用PyTorch的CrossEntropyLoss时如何处理类别不平衡问题。作者通过研究官方文档和国外论坛帖子,发现了计算权重的公式,并提供了实现代码。虽然中文资源稀缺,但作者分享了学习过程中的发现,希望对他人有所帮助。

pytorch中CrossEntropyLoss中weight的问题

由于研究的需要,最近在做一个分类器,但类别数量相差很大。
在查看nn.CrossEntropyLoss()的官方文档时看到这么一句
在这里插入图片描述
感觉有救了,遂想应用到我自己的网络中,但是weight是自己初始化的。怎么初始化又有问题了。在看focal loss的时候有点印象,样本多的类别权重应该小,但是有没有一个公式啊?
在中文互联网是找了很久,没有太多的帖子,相关问题的帖子文章很少,于是就去谷歌了。
在以下两篇帖子找到了答案。
先放链接
https://discuss.pytorch.org/t/weights-in-weighted-loss-nn-crossentropyloss/69514
帖子1
https://datascience.stackexchange.com/questions/48369/what-loss-function-to-use-for-imbalanced-classes-using-pytorch
帖子2
第一篇帖子中有两个公式,居然不一样。我就麻烦了,谁对谁错,在第二篇帖子中找到一个实例,分类样本有三类:c1(900),c1(15000),c1(800).也给了一个最后的权重。
在这里插入图片描述
第一篇帖子中有个公式可以计算出第二篇帖子中的权重,我权且相信这种权重的计算公式是对的。
原公式是这样的:

weights = torch.tensor([90015000800], dtype=torch.float32)
weights = weights / weights.sum()
weights = 1.0 / weights
weights = weights / weights.sum()
print(weights)

最后的结果为:

tensor([0.4577, 0.0275, 0.5149])

于第二篇帖子结果相同,但是他这公式一言难尽,不就是样本倒数的比值吗?搞得这嘛绕,这是我的代码`

import torch
weights = torch.tensor([900,15000,800], dtype=torch.float32)
weights = [max(weights)/x for x in weights]
print(weights)

结果一样。

本人弱鸡,写帖子主要是为了和大家分享一些学习过程中遇到的,很难在中文互联网在找到的问题。如有错误,欢迎指正。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值