All,
我正在尝试使用 Keras 对两个类进行图像分类。对于一个类,我的图像数量非常有限,比如 500。至于另一类,我的图像数量几乎是无限的。那么如果我想使用keras图像预处理,该怎么做呢?理想情况下,我需要这样的东西。对于第一类,我提供 500 个图像并使用 ImageDataGenerator 来获取更多图像。对于第二类,每次我从 1000000 个图像数据集中依次提取 500 个图像,并且可能不需要数据增强。一边看着这个例子 https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html这里还有Keras 文档 https://keras.io/preprocessing/image/,我发现默认情况下训练文件夹包含每个类别相同数量的图像。所以我的问题是,是否有现有的 API 可以实现这个技巧?如果是这样,请向我指出。如果没有,有什么解决方法可以满足这个需求吗?
你有一些选择。
Option 1
Use the class_weight
fit() 函数的参数是一个将类映射到权重值的字典。假设您有 500 个 0 类样本和 1500 个 1 类样本,而不是您输入的样本class_weight = {0:3 , 1:1}
。这使得 0 类的权重是 1 类的三倍。
train_generator.classes
为您的权重提供正确的类名称。
如果您想以编程方式计算此值,则可以使用 scikit-learnsklearn.utils.compute_class_weight()
: https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/utils/class_weight.py https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/utils/class_weight.py
该函数查看标签的分布并生成权重,以同等地惩罚训练集中代表性不足或过多的类别。
另请参阅此处的这个有用的线程:https://github.com/fchollet/keras/issues/1875 https://github.com/fchollet/keras/issues/1875
该线程也可能有帮助:是否可以在 Keras 中自动从 flow_from_directory 推断出 class_weight ? https://stackoverflow.com/questions/42586475/is-it-possible-to-automatically-infer-the-class-weight-from-flow-from-directory
Option 2
您使用带有生成器的虚拟训练运行,在其中应用图像增强(如旋转、缩放、裁剪、翻转等),并保存增强图像以供稍后的真实训练。通过这种方式,您可以为代表性不足的类别创建更大甚至平衡的数据集。
在这个虚拟运行中你设置save_to_dir
in the flow_from_directory
将函数复制到您选择的文件夹中,然后仅从您需要更多样本的类中获取图像。显然,您会丢弃任何训练结果,因为您仅使用此运行来获取更多数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)