0

我有一组不平衡的数据用于在 CNN 神经网络上进行训练。我想计算与每个标签的频率成正比的类权重,以便在计算反向传播项时增强频率较低的标签,以便它们得到很好的表示。

到目前为止我做了什么:我有一个列表 A,其中包含每个标签的频率。

A=[1009,2910,4014,152,605]

所以我做了以下 -

class_weights_new=1/(A/np.min(A))

这产生了一个权重列表,这些权重减少了与标签频率成比例的学习,以减少一个标签对其他标签的过度学习。

现在我有两个关于此事的问题 -

  1. 我的逻辑有问题吗,我错过了什么吗?
  2. 到目前为止,这个计算产生了更差的性能,我可能想平滑权重,这样它们仍然会有一些不平衡。我的意思是标签之间的比率将保持不变,但它们都会趋向于接近 1。什么是数学运算会给我这样的结果?

谢谢 !!!

4

1 回答 1

1

最常见的重量计算是,

class_weights = np.array(A/np.sum(A))

所以,你得到一个适当的规模。

使用您的方法,它也适用于高频类,重量很轻。

import numpy as np
import matplotlib.pyplot as plt

A=[1009,2910,4014,152,605]

class_weights_new=1/(A/np.min(A))

plt.plot(A)
plt.plot(class_weights_new*4000)
plt.legend(['freq', 'weights'])
plt.show()

print(class_weights_new)

在此处输入图像描述

您也可以使用 scikit-learn 来计算类权重:https ://scikit-learn.org/stable/modules/generated/sklearn.utils.class_weight.compute_class_weight.html

于 2020-05-14T08:26:27.830 回答