【问题标题】:Class weights worsen my keras classification model类权重恶化了我的 keras 分类模型
【发布时间】:2020-11-01 11:13:07
【问题描述】:

我有一个模型用于对一些数据进行分类,它的目标输出为 21。它使用 adam 优化器和分类交叉熵损失。为了改善模型损失,我对数据集中的类频率进行了可视化,发现前 2 个类的频率约为 25,000 和 20,000,而最低 2 个类的频率约为 4、40。其他类范围从 100 到 2000。我意识到这是一个明显的值差异,并尝试添加我使用 sklearn 提取的类内权重,如下所示:

我的 y 数组是 one-hot 编码风格,类似于:

class1,   class2, class3, class4 ... class21
   0        0       1       0    ...    0 
   1        0       0       0    ...    0
   0        1       0       0    ...    0
from sklearn.utils.class_weight import compute_class_weight

y_int = np.argmax(y.to_numpy(), axis=1)
weights = compute_class_weight('balanced', classes=np.unique(y_int), y=y_int)
di = dict(enumerate(class_weights))

但是我的损失恶化了,到第 50 个 epoch 时,我的损失值开始在 30 到 50 之间。与没有班级权重我得到大约 0.4 的事实相比,这太可怕了。

我提取班级权重的方式有问题吗?还是我不应该完全使用班级权重? 如果不是,我应该用什么来解释这种巨大的不平衡? -谢谢

【问题讨论】:

  • 你从哪里得到损失分数?它们会是加权损失吗?
  • 当我使用 model.fit() 在 keras 中训练我的深度学习模型时,我得到了损失分数,它不是“加权损失”,我使用的是“categorical_crossentropy”损失。

标签: python keras scikit-learn deep-learning


【解决方案1】:

Keras 在训练期间打印 weighted 损失;您可以通过例如将所有班级权重加倍来确认这一点。因此,加权模型的较大损失可能只是表明较小的类别更难分类,现在您将损失的注意力集中在那些分数较低的较小类别上。

【讨论】:

  • 哇,谢谢。所以最好的选择是完全删除类权重,因为它很难?
  • 不一定;使用类权重是为了迫使模型更关心那些小类的正确性。这取决于您的用例是否是您想要发生的事情。损失大多是无法比拟的;如果可以,请使用特定于上下文的指标。
猜你喜欢
  • 2017-09-09
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 2019-08-30
  • 2018-07-07
  • 1970-01-01
  • 2020-05-13
相关资源
最近更新 更多