使用 keras 图像生成器平衡不平衡的数据集
balancing an imbalanced dataset with keras image generator
keras
ImageDataGenerator
可用于“Generate batches of tensor image data with real-time data augmentation”
教程 here 演示了如何使用 ImageDataGenerator 扩充一个小而平衡的数据集。有没有一种简单的方法可以使用此生成器来扩充严重不平衡的数据集,从而使生成的数据集平衡?
这不是处理不平衡数据的标准方法。我也不认为这是真正合理的——你会显着改变你的 classes 的分布,其中较小的 class 现在的可变性要小得多。 class越大,变化越丰富,越小,仿射变换越小,相似图像越多。他们将生活在比大多数 class.
图像 space 小得多的区域
更标准的方法是:
- model.fit 中的 class_weights 参数,您可以使用它使模型从少数 class 中学到更多。
- 减少大多数 class.
的大小
- 接受不平衡。深度学习可以解决这个问题,它只需要更多的数据(真的是解决所有问题的方法)。
前两个选项实际上是一种 hack,可能会损害您处理现实世界(不平衡)数据的能力。两者都没有真正解决数据太少所固有的低可变性问题。如果在模型训练后应用到真实世界的数据集不是问题,你只是想在你拥有的数据上得到好的结果,那么这些选项就很好(而且比为单个 class 制作生成器容易得多)。
如果你有足够的数据,第三个选项是正确的方法(例如,recent paper from Google about detecting diabetic retinopathy 在阳性案例占 10% 到 30% 的数据集中实现了高精度)。
如果您真的想为一张 class 生成各种增强图像而不是另一张,那么在 pre-processing 中完成这件事可能最简单。获取少数 class 的图像并生成一些增强版本,并将其称为数据的所有部分。就像我说的,这一切都非常 hacky。
您可以使用此策略根据不平衡计算权重:
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
ImageDataGenerator
可用于“Generate batches of tensor image data with real-time data augmentation”
教程 here 演示了如何使用 ImageDataGenerator 扩充一个小而平衡的数据集。有没有一种简单的方法可以使用此生成器来扩充严重不平衡的数据集,从而使生成的数据集平衡?
这不是处理不平衡数据的标准方法。我也不认为这是真正合理的——你会显着改变你的 classes 的分布,其中较小的 class 现在的可变性要小得多。 class越大,变化越丰富,越小,仿射变换越小,相似图像越多。他们将生活在比大多数 class.
图像 space 小得多的区域更标准的方法是:
- model.fit 中的 class_weights 参数,您可以使用它使模型从少数 class 中学到更多。
- 减少大多数 class. 的大小
- 接受不平衡。深度学习可以解决这个问题,它只需要更多的数据(真的是解决所有问题的方法)。
前两个选项实际上是一种 hack,可能会损害您处理现实世界(不平衡)数据的能力。两者都没有真正解决数据太少所固有的低可变性问题。如果在模型训练后应用到真实世界的数据集不是问题,你只是想在你拥有的数据上得到好的结果,那么这些选项就很好(而且比为单个 class 制作生成器容易得多)。
如果你有足够的数据,第三个选项是正确的方法(例如,recent paper from Google about detecting diabetic retinopathy 在阳性案例占 10% 到 30% 的数据集中实现了高精度)。
如果您真的想为一张 class 生成各种增强图像而不是另一张,那么在 pre-processing 中完成这件事可能最简单。获取少数 class 的图像并生成一些增强版本,并将其称为数据的所有部分。就像我说的,这一切都非常 hacky。
您可以使用此策略根据不平衡计算权重:
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)
此答案的灵感来自