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

时间:2017-01-14 08:29:03

标签: keras

keras

ImageDataGenerator

可用于“通过实时数据增强生成批量张量图像数据”(https://keras.io/preprocessing/image/

中的教程

https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

演示了如何使用ImageDataGenerator扩充小而平衡的数据集。是否有一种简单的方法可以使用此生成器来增加严重不平衡的数据集,从而使生成的生成数据集得到平衡?

2 个答案:

答案 0 :(得分:26)

这不是处理不平衡数据的标准方法。我也不认为它是真的有道理 - 你将显着改变你的类的分布,其中较小的类现在变化较小。较大的类具有丰富的变化,较小的类似图像具有小的仿射变换。它们将生活在图像空间中比大多数类更小的区域。

更标准的方法是:

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

前两个选项实际上是一种黑客攻击,可能会损害您应对现实世界(不平衡)数据的能力。两者都没有真正解决低变异性的问题,这是数据太少所固有的。如果在模型训练之后应用于真实世界数据集并不是一个问题,并且您只想在所拥有的数据上获得良好的结果,那么这些选项很好(并且比为单个类生成生成器要容易得多)。

如果您有足够的数据,第三个选项是正确的方法(例如,recent paper from Google about detecting diabetic retinopathy在数据集中获得高准​​确度,其中阳性病例在10%到30%之间)。

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

答案 1 :(得分:2)

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

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)

这个答案的灵感来自Is it possible to automatically infer the class_weight from flow_from_directory in Keras?