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([900,15000,800], 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)
结果一样。
本人弱鸡,写帖子主要是为了和大家分享一些学习过程中遇到的,很难在中文互联网在找到的问题。如有错误,欢迎指正。
本文探讨了在使用PyTorch的CrossEntropyLoss时如何处理类别不平衡问题。作者通过研究官方文档和国外论坛帖子,发现了计算权重的公式,并提供了实现代码。虽然中文资源稀缺,但作者分享了学习过程中的发现,希望对他人有所帮助。

9492

被折叠的 条评论
为什么被折叠?



