所有,
我正在尝试使用Keras对两个类进行图像分类 . 对于一个 class ,我的图像数量非常有限,比如500.对于另一个 class ,我的图像数量几乎无穷无尽 . 所以,如果我想使用keras图像预处理,该怎么做?理想情况下,我需要这样的东西 . 对于第一类,我提供500个图像并使用ImageDataGenerator来获取更多图像 . 对于第二类,每次我从1000000图像数据集中依次提取500个图像,并且可能不需要数据增加 . 在这里查看the example以及Keras documentation时,我发现训练文件夹默认包含每个类的相同数量的图像 . 所以我的问题是,是否存在用于执行此操作的现有API?如果是这样,请向我指出 . 如果没有,是否有针对此需求的解决方法?
1 回答
你有一些选择 .
Option 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?
Option 2
您可以使用带有生成器的虚拟训练运行,您可以应用旋转,缩放,裁剪,翻转等图像增强,并在以后保存增强图像以进行实际训练 . 通过这种方式,您可以为代表性不足的类创建更大或更 balancer 的数据集 .
在这个虚拟运行中,您将
flow_from_directory
函数中的save_to_dir
设置为您选择的文件夹,稍后仅从您需要更多样本的类中获取图像 . 您显然会丢弃任何训练结果,因为您只使用此运行来获取更多数据 .