在 Keras 中使用类权重和验证数据

数据挖掘 机器学习 Python 神经网络 深度学习 喀拉斯
2022-03-07 17:04:57

我正在使用验证数据进行超参数优化,并尝试使用类权重。对于model.fit(),有一个选项可以将类权重(参数是class_weight)传递给测试数据的函数,但我想对验证数据做同样的事情。

另一位用户前段时间也有同样的问题,但没有给出满意的答案:

Keras 验证期间的类加权

将验证数据作为参数传递给model.fit()时,验证数据可以采用元组的形式:( x_val, y_val, val_sample_weights),但在 Keras 文档中,我没有看到任何使用类权重而不是样本权重的方法。

有没有人知道如何在 Keras 中使用类权重和验证数据?

以下是一些可能有用的信息:

从 Keras 文档中,class_weight参数的描述:

字典将类索引(整数)映射到权重(浮点)值,用于加权损失函数(仅在训练期间)。这对于告诉模型“更加关注”来自代表性不足的类的样本很有用。

这是 Francois Chollet 的笔记本,其中显示了使用 class_weight 的示例:https ://colab.research.google.com/drive/1xL2jSdY-MGlN60gGuSH_L30P7kxxwUfM#scrollTo=REP1KlrSEx-m

谢谢你的帮助!

2个回答

类权重仅在损失函数的上下文中才有意义。当您验证您的模型时,您正在使用度量进行预测并与基本事实进行比较 - 但在那个阶段您不会传播任何更改,因此权重是无用的。

我认为遗憾的是,Keras 不允许在验证集上使用类权重。但是,您可以将类权重转换为样本权重,并将其插入元组的最后一个元素:( x_val, y_val, val_sample_weights)。

在您提供的二进制分类示例中,可以通过以下方式完成翻译:

val_sample_weights = val_targets*class_weight[1] + (1-val_targets)*class_weight[0].

然后你应该有一个与验证集长度相同的数组,其中包含每个数据点所需的类权重。