【问题标题】:How to balance dataset using fit_generator() in Keras?如何在 Keras 中使用 fit_generator() 平衡数据集?
【发布时间】:2021-01-16 12:56:31
【问题描述】:

我正在尝试使用 keras 来拟合 CNN 模型来分类 2 类数据。我有不平衡的数据集我想平衡数据。我不知道我可以在 model.fit_generator 中使用 class_weight 。我想知道我是否在model.fit_generator中使用了class_weight="balanced"

主要代码

def generate_arrays_for_training(indexPat, paths, start=0, end=100):      
    while True:
        from_=int(len(paths)/100*start)
        to_=int(len(paths)/100*end)
        for i in range(from_, int(to_)):
            f=paths[i]
            x = np.load(PathSpectogramFolder+f) 
            x = np.expand_dims(x, axis=0) 
            
            if('P' in f):
                y = np.repeat([[0,1]],x.shape[0], axis=0)
            else:
                y =np.repeat([[1,0]],x.shape[0], axis=0)
            yield(x,y)   
history=model.fit_generator(generate_arrays_for_training(indexPat, filesPath, end=75), 
                                validation_data=generate_arrays_for_training(indexPat, filesPath, start=75),
                                steps_per_epoch=int((len(filesPath)-int(len(filesPath)/100*25))), 
                                validation_steps=int((len(filesPath)-int(len(filesPath)/100*75))),
                                verbose=2,
                                epochs=15, max_queue_size=2, shuffle=True, callbacks=[callback])

【问题讨论】:

  • 你可以像implementation一样使用class_weight。
  • @HweiGeokNg 我希望数据同样平衡。我该怎么做??
  • 查看此博客:androidkt.com/set-class-weight-for-imbalance-dataset-in-keras。有一个名为 compute_class_weight() 的函数可以用作 class_weight 的参数。
  • @HweiGeokNg 我知道这个函数,但我的数据集中没有 x_train 和 y_train 我使用 generate_arrays_for_training 函数。请检查代码我将这个函数。
  • 抱歉,我错过了这些信息。我帮不了你,希望其他人能来救援。

标签: python machine-learning keras deep-learning generator


【解决方案1】:

如果您不想更改数据创建过程,可以在 fit 生成器中使用 class_weight。您可以使用字典来设置您的 class_weight 并通过微调进行观察。例如,当不使用 class_weight 时,class0 有 50 个示例,class1 有 100 个示例。然后,损失函数统一计算损失。这意味着 class1 将是一个问题。但是,当你设置:

class_weight = {0:2 , 1:1}

这意味着损失函数现在会给你的 0 类赋予 2 倍的权重。因此,对代表性不足的数据进行错误分类将受到比以前多 2 倍的惩罚。因此,模型可以处理不平衡的数据。

如果您使用class_weight='balanced' 模型可以自动进行该设置。但我的建议是,创建一个像class_weight = {0:a1 , 1:a2} 这样的字典,并为 a1 和 a2 尝试不同的值,这样你就可以理解差异了。

此外,您可以对不平衡数据使用欠采样方法,而不是使用 class_weight。为此目的检查 Bootstrapping 方法。

【讨论】:

  • 非常感谢您的解决方案。我想问如何确定 a1 和 a2 的值??? ,不知道a1和a2应该写什么值??
  • 你可以找到两个类之间的比率。例如,如果 class1 中的实例数是 class2 的 2 倍,您可以分配 class_weight = {class1: 1, class2: 2} 反之亦然。重要的一点是比率。顺便说一句,您可以使用train_generator.classes 为class1 和class2 分配类名来查找类名。
  • 很好。非常感谢我明白了。好的 我怎样才能使用train_generator.classes ??
  • 我猜你的问题train_generator.classes 是没有必要的。另外,您可以在这里查看更多信息groups.google.com/g/keras-users/c/MUO6v3kRHUw?pli=1
猜你喜欢
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
  • 2022-07-17
  • 2018-05-04
  • 2021-04-15
  • 2018-09-23
相关资源
最近更新 更多