【问题标题】:Same ImageDataGenerator but different class_indices - How to remap the classes within a generator?相同的 ImageDataGenerator 但不同的 class_indices - 如何重新映射生成器中的类?
【发布时间】:2018-11-25 23:39:59
【问题描述】:

背景

我正在训练一个将两个图像作为输入的模型。由于数据太大而无法放入我的机器 RAM,我使用 flow_from_dataframe 创建用于训练和验证的生成器 - 两个训练生成器,每个生成器提供各自的图像之一(前视图和后视图,如 @ 所示987654322@参数)和两个生成器分别进行验证。

像这样:

datagen=ImageDataGenerator(rescale=1. / 255)

X1_train_generator =datagen.flow_from_dataframe(dataframe=train, directory=data_dir, x_col="front", y_col=target, has_ext=True, class_mode="categorical", target_size=(224,224), batch_size=batch_size,seed = 1)
X2_train_generator=datagen.flow_from_dataframe(dataframe=train, directory=data_dir, x_col="back", y_col=target, has_ext=True, class_mode="categorical", target_size=(224,224), batch_size=batch_size,seed = 1)

X1_validation_generator =datagen.flow_from_dataframe(dataframe=test, directory=data_dir, x_col="front", y_col=target, has_ext=True, class_mode="categorical", target_size=(224,224), batch_size=batch_size,seed = 1)
X2_validation_generator=datagen.flow_from_dataframe(dataframe=test, directory=data_dir, x_col="back", y_col=target, has_ext=True, class_mode="categorical", target_size=(224,224), batch_size=batch_size,seed = 1)

为了结合训练和验证生成器进行训练,我正在使用:

def format_gen_outputs(gen1,gen2):
    x1 = gen1[0]
    x2 = gen2[0]
    y1 = gen1[1]
    return [x1, x2], y1

train_combo_gen= map(format_gen_outputs, X1_train_generator , X2_train_generator )
validation_combo_gen= map(format_gen_outputs, X1_validation_generator , X2_validation_generator )

现在我使用fit_generator 训练我的模型,将train_combo_gen 传递给训练目的,将validation_combo_gen 传递给validation_data 参数以进行验证

问题

但是,我意识到我的 X1_train_generatorX2_train_generator 显示的 .class_indices 映射与我的其他两个验证生成器 X1_validation_generatorX2_validation_generator 不同。

像这样(注意猫和狗是如何分配到不同的类的):

X1_train_generator.class_indices
>> {'cat': 0, 'dog': 1, 'car': 2, 'bike': 3}

X1_validation_generato.class_indices
>> {'dog': 0, 'cat': 1, 'car': 2, 'bike': 3}

问题

因此,我在训练期间不信任我的 val_lossval_acc。有没有办法解决这个问题,即重新映射生成器中的类?

【问题讨论】:

    标签: python tensorflow keras generator


    【解决方案1】:

    当您没有使用classes 参数显式设置类时,flow_from_dataframe 在内部使用y_colto find the classes 上的pandas 系列unique 方法:

    if not classes:
        classes = []
        if class_mode not in ["other", "input", None]:
            classes = list(self.df[y_col].unique())
    

    unique 方法将按列中出现的顺序返回唯一值。由于您的训练数据帧和测试数据帧中标签的出现顺序彼此不同,因此您将获得不同的类索引。

    一种解决方法是为所有 flow_from_dataframe 调用显式设置 classes 参数,以保证在训练和验证生成器中映射相同的类索引:

    X1_train_generator =datagen.flow_from_dataframe(dataframe=train, 
                                                    classes=['cat', 'dog', 'car', 'bike'], ...)
    
    # do the same for `X2_train_generator`, `X1_validation_generator` and `X2_validation_generator`
    

    【讨论】:

    • 非常感谢!这正是我一直在寻找的。完全错过了有一个类参数的事实!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 2019-12-17
    相关资源
    最近更新 更多