【问题标题】:Keras - class_weight vs sample_weights in the fit_generatorKeras - fit_generator 中的 class_weight 与 sample_weights
【发布时间】:2017-09-13 12:48:45
【问题描述】:

在 Keras(使用 TensorFlow 作为后端)中,我正在构建一个模型,该模型正在处理具有高度不平衡类(标签)的巨大数据集。为了能够运行训练过程,我创建了一个生成器,它将数据块提供给fit_generator

根据fit_generator 的文档,生成器的输出可以是元组(inputs, targets) 或元组(inputs, targets, sample_weights)。考虑到这一点,这里有几个问题:

  1. 我的理解是 class_weight 考虑整个数据集的所有类的权重,而 sample_weights 考虑每个单独块的所有类的权重 由生成器创建。那是对的吗?如果没有,有人可以详细说明一下吗?
  2. 是否有必要将class_weight 提供给fit_generator,然后将sample_weights 作为每个块的输出?如果是,那为什么?如果没有,那么哪个更好?
  3. 如果我应该为每个块提供sample_weights,如果特定块中缺少某些类,我该如何映射权重?让我举个例子。在我的整个数据集中,我有 7 个可能的类(标签)。因为这些类高度不平衡,所以当我创建较小的数据块作为fit_generator 的输出时,特定块中缺少一些类。我应该如何为这些块创建sample_weights

【问题讨论】:

标签: tensorflow keras


【解决方案1】:

我的理解是 class_weight 考虑了所有人的权重 整个数据集的类,而 sample_weights 考虑 由 发电机。那是对的吗?如果没有,有人可以详细说明 重要吗?

class_weight在目标函数的计算中影响每个类的相对权重。 sample_weights,顾名思义,允许进一步控制样本的相对权重属于同一类

是否有必要将 class_weight 同时赋予 fit_generator 和 然后将 sample_weights 作为每个块的输出?如果是,那为什么? 如果不是,那么哪个更好?

这取决于您的应用程序。在对高度倾斜的数据集进行训练时,类权重很有用;例如,用于检测欺诈交易的分类器。当您对批次中的样品没有同等的信心时,样品重量很有用。一个常见的例子是对具有可变不确定性的测量执行回归。

如果我应该为每个块提供 sample_weights,我该如何映射 如果特定块中缺少某些类,则权重?让 我举个例子。在我的整个数据集中,我有 7 个可能的类 (标签)。因为这些类是高度不平衡的,所以当我创建 较小的数据块作为 fit_generator 的输出,其中一些 特定块中缺少类。我应该如何创建 这些块的 sample_weights?

这不是问题。 sample_weights 是基于每个样本定义的,并且独立于类。出于这个原因,documentation 声明(inputs, targets, sample_weights) 应该是相同的长度。

engine/training.py 中的 function _weighted_masked_objective 有一个正在应用 sample_weights 的示例。

【讨论】:

  • 嗨 dhinckley,我想知道我可以使用 sample_weights 来控制梯度更新方向吗?我正在做一个强化学习项目,但我需要在两个方向上更新梯度以获得正负奖励,我找到了一些使用自定义损失函数更新梯度的解决方案,但是我可以用负权重做一个 sample_weights 技巧吗如果我对sample_weights 理解正确?
猜你喜欢
  • 2019-04-20
  • 2021-04-26
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
相关资源
最近更新 更多