keras 图像预处理不平衡数据

Posted

技术标签:

【中文标题】keras 图像预处理不平衡数据【英文标题】:keras image preprocessing unbalanced data 【发布时间】:2017-11-23 19:34:09 【问题描述】:

全部,

我正在尝试使用 Keras 对两个类进行图像分类。对于一类,我的图像数量非常有限,比如 500 个。至于另一类,我的图像数量几乎是无限的。那么如果我想使用 keras 图像预处理,该怎么做呢?理想情况下,我需要这样的东西。对于第一类,我提供 500 张图像并使用 ImageDataGenerator 获取更多图像。对于第二类,每次我从 1000000 个图像数据集中依次提取 500 个图像,并且可能不需要数据增强。在查看the example 和Keras documentation 时,我发现训练文件夹默认包含每个类的相同数量的图像。所以我的问题是,是否有现有的 API 可以做到这一点?如果是这样,请向我指出。如果没有,是否有解决此需求的方法?

【问题讨论】:

【参考方案1】:

你有一些选择。

选项 1

使用 fit() 函数的 class_weight 参数,该函数是将类映射到权重值的字典。假设您有 500 个 0 类样本和 1500 个 1 类样本,而不是您输入 class_weight = 0:3 , 1:1。这使 0 类的权重是 1 类的三倍。

train_generator.classes 为您提供适当的类名称以进行加权。

如果您想以编程方式计算此值,则可以使用 scikit-learn 的 sklearn.utils.compute_class_weight(): https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/utils/class_weight.py

该函数查看标签的分布并生成权重,以同样惩罚训练集中代表不足或过度代表的类。

在这里也可以看到这个有用的帖子:https://github.com/fchollet/keras/issues/1875

这个帖子也可能有帮助:Is it possible to automatically infer the class_weight from flow_from_directory in Keras?

选项 2

您使用带有生成器的虚拟训练运行,您可以在其中应用旋转、缩放、裁剪、翻转等图像增强,并保存增强后的图像以供以后进行实际训练。这样,您就可以为代表性不足的班级创建更大甚至平衡的数据集。

在这个虚拟运行中,您将flow_from_directory 函数中的save_to_dir 设置为您选择的文件夹,然后只从需要更多样本的类中获取图像。您显然会丢弃任何训练结果,因为您只使用此运行来获取更多数据。

【讨论】:

首先非常感谢您的及时回复。我查看了您提供的有关 class_weight 的链接。我觉得设置 class_weight 非常棘手,并且没有标准的方法来做到这一点。所以我必须根据我的情况调整它。我的理解对吗? 第二,我希望在为每个 epoch 进行训练的同时,我可以为这两个类提供少量图像。如果我使用增强来为第一类获取更多图像,那么在不同的时期,我应该再次进行数据增强还是模型会多次使用相同的图像? 非常感谢。但我想知道在你原来的答案中,也许是 class_weight = 0:75 , 1:25 而不是 class_weight = 0:25 , 1:75 也许 class_weight = 0:3 , 1:1 有利于收敛,因为我担心像 75 和 25 这样的值可能会直接用于像 SGD 这样的反向传播算法。或者算法将计算百分比而不是使用这些数字?谢谢。 是的,我知道数组索引从 0 开始。我认为 1 类(500 张图像)是少数类,因此我们必须根据代码中的代码为其设置更大的权重[最后一个链接]你给了。 (***.com/questions/42586475/…)

以上是关于keras 图像预处理不平衡数据的主要内容,如果未能解决你的问题,请参考以下文章

Keras CIFAR-10图像分类 GoogleNet 篇

Keras CIFAR-10图像分类 GoogleNet 篇

Keras CIFAR-10图像分类 AlexNet篇

Keras CIFAR-10图像分类 LeNet-5篇

使用 keras 预训练 vgg16 的感知损失,输出图像颜色不正确

Keras ImageDataGenerator 不处理符号链接文件