是否可以从Keras的flow_from_directory自动推断出class_weight?

Fáb*_*rez 10 deep-learning keras

我有一个不平衡的多类数据集,我想使用class_weight参数from fit_generator根据每个类的图像数量给类加权.我正在使用ImageDataGenerator.flow_from_directory从目录加载数据集.

是否可以直接class_weightImageDataGenerator对象推断出参数?

Fáb*_*rez 23

刚刚找到了实现这一目标的方法.

from collections import Counter
train_datagen = ImageDataGenerator()
train_generator = train_datagen.flow_from_directory(...)

counter = Counter(train_generator.classes)                          
max_val = float(max(counter.values()))       
class_weights = {class_id : max_val/num_images for class_id, num_images in counter.items()}                     

model.fit_generator(...,
                    class_weight=class_weights)
Run Code Online (Sandbox Code Playgroud)

train_generator.classes是每个图像的类列表. Counter(train_generator.classes)创建每个类中图像数量的计数器.

请注意,这些权重可能不适合收敛,但您可以将其用作基于事件的其他类型加权的基础.

这个答案的灵感来自:https://github.com/fchollet/keras/issues/1875#issuecomment-273752868


小智 9

或者,您可以简单地执行以下操作:

from sklearn.utils import class_weight
import numpy as np

class_weights = class_weight.compute_class_weight(
               'balanced',
                np.unique(train_generator.classes), 
                train_generator.classes)
Run Code Online (Sandbox Code Playgroud)

然后,您可以进行设置(根据上面的评论):

model.fit_generator(..., class_weight=class_weights)
Run Code Online (Sandbox Code Playgroud)