使用keras图像生成器平衡不平衡的数据集



keras

ImageDataGenerator

可用于"生成具有实时数据增强的张量图像数据批次">

这里的教程演示了如何使用ImageDataGenerator来增强小型但平衡的数据集。有没有一种简单的方法可以使用这个生成器来增强严重不平衡的数据集,从而使生成的数据集平衡?

这不是处理不平衡数据的标准方法。我也不认为这是真正合理的——你会显著改变类的分布,而现在较小的类的变化要小得多。较大的类别将具有丰富的变化,较小的类别将有许多具有小仿射变换的相似图像。他们将生活在图像空间中比大多数阶级小得多的区域。

更标准的方法是:

  • model.fit中的class_weights参数,您可以使用它使模型从少数类中学习更多
  • 减少了多数阶级的规模
  • 接受这种不平衡。深度学习可以解决这个问题,它只需要更多的数据(真的是解决所有问题的方法)

前两个选项确实是一种技巧,可能会损害你处理现实世界(不平衡)数据的能力。两者都没有真正解决数据过少所固有的低可变性问题。如果在模型训练后应用于真实世界的数据集不是一个问题,并且您只想在现有数据上获得良好的结果,那么这些选项是可以的(而且比为单个类制作生成器容易得多)。

如果你有足够的数据,第三种选择是正确的方法(例如,谷歌最近关于检测糖尿病视网膜病变的论文在阳性病例在10%至30%之间的数据集中实现了高准确率)。

如果你真的想为一个类生成各种增强图像,那么在预处理中可能最容易做到。取少数类的图像,生成一些增强版本,并将其称为数据的一部分。就像我说的那样,这一切都很棘手。

您可以使用此策略根据不平衡计算权重:

from sklearn.utils import class_weight 
import numpy as np
class_weights = class_weight.compute_class_weight(
'balanced',
np.unique(train_generator.classes), 
train_generator.classes)
train_class_weights = dict(enumerate(class_weights))
model.fit_generator(..., class_weight=train_class_weights)

这个答案受到了Keras中是否可以从flow_from_directory自动推断class_weight的启发?

最新更新