【发布时间】: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