pytorch中CrossEntropyLoss中weight的问题

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).也给了一个最后的权重。
pytorch中CrossEntropyLoss中weight的问题_第1张图片
第一篇帖子中有个公式可以计算出第二篇帖子中的权重,我权且相信这种权重的计算公式是对的。
原公式是这样的:

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)

结果一样。

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

你可能感兴趣的:(深度学习,pytorch,人工智能)