Python 如何在Keras中使用fit_generator()平衡数据集?

Python 如何在Keras中使用fit_generator()平衡数据集?,python,machine-learning,keras,deep-learning,generator,Python,Machine Learning,Keras,Deep Learning,Generator,我试图使用keras来拟合CNN模型,对两类数据进行分类。我的数据集不平衡,我想平衡数据。我不知道是否可以在模型中使用class\u权重。安装发电机。我想知道我是否在模型中使用了class\u weight=“balanced” 主代码: def generate_arrays_for_training(indexPat, paths, start=0, end=100): while True: from_=int(len(paths)/100*start)

我试图使用keras来拟合CNN模型,对两类数据进行分类。我的数据集不平衡,我想平衡数据。我不知道是否可以在
模型中使用class\u权重。安装发电机
。我想知道我是否在
模型中使用了
class\u 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])


如果不想更改数据创建过程,可以在fit generator中使用
class\u weight
。您可以使用字典设置类权重,并进行微调观察。例如,当未使用class_weight时,类0有50个示例,类1有100个示例。然后,损失函数统一计算损失。这意味着1级将是一个问题。但是,当您设置:

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

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


此外,还可以对不平衡数据使用欠采样方法,而不是使用class_权重。为此,请选中引导方法。

您可以像这样使用类权重。@HweiGeokNg我希望数据均衡。我该怎么做?请查看此博客:。有一个名为compute_class_weight()的函数,可以用作class_weight的参数。@HweiGeokNg我知道这个函数,但我的数据集中没有x_train和y_train,我使用
为_training生成数组
函数。请检查我将使用此功能的代码。抱歉,我错过了该信息。我帮不了你,希望有人能来帮忙。非常感谢你的解决方案。我想问我如何确定a1和a2的值,我不知道a1和a2应该写什么值??你们可以找到两个类之间的比率。例如,若class1中的实例数是class2的2倍,那个么可以指定class_weight={class1:1,class2:2},反之亦然。重要的一点是比率。顺便说一句,您可以使用
train\u generator.classes
为class1和class2指定类名来查找类名。非常好。非常感谢我的理解。好的,我如何使用
列车生成器。类
?我想在你的问题中
列车生成器。类
是不必要的。另外,您可以在这里查看更多信息