Keras图像预处理不平衡数据

10

大家好,

我正在尝试使用Keras对两个类别的图像进行分类。对于一个类别,我的图片数量非常有限,比如只有500张。对于另一个类别,我几乎有无穷多的图片。那么如果我想要使用Keras的图像预处理,应该怎么做呢?理想情况下,我需要这样的东西:对于第一个类别,我提供500张图像,并使用ImageDataGenerator获取更多图像。对于第二个类别,每次我从1000000张图像数据集中按顺序提取500张图像,可能不需要进行数据增强。在查看这里的示例以及Keras文档时,我发现默认情况下训练文件夹包含每个类别相同数量的图像。所以我的问题是,是否存在用于执行此操作的API?如果有,请指出给我。如果没有,是否有任何解决方法?

1个回答

11

你有以下几个选项:

选项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

你可以使用一个generator进行虚拟训练,应用图像增强(例如旋转,缩放,裁剪,翻转等),并为真正的训练保存增强后的图像。 这样就可以为欠表示的类别创建更大或更平衡的数据集。

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

1
首先非常感谢您的及时回复。我查看了您提供的有关class_weight的链接。我觉得设置class_weight非常棘手,没有标准的方法来做。所以我必须根据我的情况进行调整。我的理解正确吗? - Jane
1
其次,我希望在每个epoch的训练过程中,两个类别的图像数量都能够尽可能地少。如果我使用数据增强来获取第一类的更多图像,那么在不同的epoch中,我是否应该再次进行数据增强,还是模型会多次使用相同的图像? - Jane
1
也许 class_weight = {0:3, 1:1} 对于收敛是好的,因为我担心像75和25这样的值可能会直接用于反向传播算法,如 SGD。或者算法会计算百分比而不是使用这些数字?谢谢。 - Jane
1
是的,我知道数组索引从0开始。我认为类1(500张图片)是少数类,因此我们必须根据您提供的[最后一个链接]中的代码为其设置更大的权重。(https://dev59.com/11gQ5IYBdhLWcg3wi0k9) - Jane
1
谢谢您提供的两个选项。虽然我担心使用class_weight选项惩罚少数类别可能会导致一些正则化问题,但我会进行实验。稍后我会回来发布我的结果。 - Jane
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接