所有
我试图用Keras对两个类进行图像分类。对于一个班级,我的图像数量非常有限,比如500.对于另一个班级,我的图像数量几乎无穷无尽。所以,如果我想使用keras图像预处理,该怎么做?理想情况下,我需要这样的东西。对于第一类,我提供500个图像并使用ImageDataGenerator来获取更多图像。对于第二类,每次我从1000000图像数据集中依次提取500个图像,并且可能不需要数据增加。在此处查看the example以及Keras documentation时,我发现默认情况下,培训文件夹包含每个类的相同数量的图像。所以我的问题是,是否存在用于执行此操作的现有API?如果是这样,请向我指出。如果没有,是否有针对此需求的解决方法?
答案 0 :(得分:7)
你有一些选择。
选项1
使用fit()函数的class_weight
参数,该函数是将类映射到权重值的字典。假设您有500个0级样本和1500个1级样本,而不是class_weight = {0:3 , 1:1}
。这使得0级的等级是等级1的三倍。
train_generator.classes
为您的加权提供了正确的类名。
如果您想以编程方式计算此数字而不是使用scikit-learn's 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
您使用带有生成器的虚拟训练运行,您可以应用旋转,缩放,裁剪,翻转等图像增强,并在以后保存增强图像以进行实际训练。通过这种方式,您可以为代表性不足的类创建更大或更平衡的数据集。
在这个虚拟运行中,您将save_to_dir
函数中的flow_from_directory
设置为您选择的文件夹,稍后只会从您需要更多样本的类中获取图像。您显然会丢弃任何培训结果,因为您只使用此次运行来获取更多数据。