Keras - fit_generator中的class_weight vs sample_weights

Rad*_*duS 12 keras tensorflow

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

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

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

dhi*_*ley 15

我的理解是class_weight考虑整个数据集的所有类的权重,而sample_weights考虑生成器创建的每个单独的块的权重.那是对的吗?如果没有,有人可以详细说明此事吗?

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

是否有必要将class_weight同时提供给fit_generator,然后将sample_weights作为每个chunk的输出?如果是,那为什么呢?如果不是那么哪一个更好?

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

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

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

功能 _weighted_masked_objectiveengine/training.py具有sample_weights的示例被应用.