【问题标题】:How to avoid augmenting data in validation split of Keras ImageDataGenerator?如何避免在 Keras ImageDataGenerator 的验证拆分中增加数据?
【发布时间】:2020-05-18 07:13:34
【问题描述】:

我正在使用以下生成器:

datagen = ImageDataGenerator(
    fill_mode='nearest',
    cval=0,
    rescale=1. / 255,
    rotation_range=90,
    width_shift_range=0.1,
    height_shift_range=0.1,
    zoom_range=0.5,
    horizontal_flip=True,
    vertical_flip=True,
    validation_split = 0.5,
)

train_generator = datagen.flow_from_dataframe(
    dataframe=traindf,
    directory=train_path,
    x_col="id",
    y_col=classes,
    subset="training",
    batch_size=8,
    seed=123,
    shuffle=True,
    class_mode="other",
    target_size=(64,64))


STEP_SIZE_TRAIN = train_generator.n // train_generator.batch_size

valid_generator = datagen.flow_from_dataframe(
    dataframe=traindf,
    directory=train_path,
    x_col="id",
    y_col=classes,
    subset="validation",
    batch_size=8,
    seed=123,
    shuffle=True,
    class_mode="raw",
    target_size=(64, 64))

STEP_SIZE_VALID = valid_generator.n // valid_generator.batch_size

现在的问题是验证数据也在增加,我猜这不是你在训练时想要做的事情。我该如何避免这种情况?我没有两个用于训练和验证的目录。我想使用单个数据框来训练网络。有什么建议吗?

【问题讨论】:

标签: python tensorflow keras data-augmentation


【解决方案1】:

我的朋友找到的解决方案是使用不同的生成器,但具有相同的验证拆分并且没有随机播放。

datagen = ImageDataGenerator(
    #featurewise_center=True,
    #featurewise_std_normalization=True,
    rescale=1. / 255,
    rotation_range=90,
    width_shift_range=0.1,
    height_shift_range=0.1,
    zoom_range=0.5,
    horizontal_flip=True,
    vertical_flip=True,
    validation_split = 0.15,
)

valid_datagen=ImageDataGenerator(rescale=1./255,validation_split=0.15)

然后你可以将两个生成器定义为

train_generator = datagen.flow_from_dataframe(
    dataframe=traindf,
    directory=train_path,
    x_col="id",
    y_col=classes,
    subset="training",
    batch_size=64,
    seed=123,
    shuffle=False,
    class_mode="raw",
    target_size=(224,224))


STEP_SIZE_TRAIN = train_generator.n // train_generator.batch_size

valid_generator = valid_datagen.flow_from_dataframe(
    dataframe=traindf,
    directory=train_path,
    x_col="id",
    y_col=classes,
    subset="validation",
    batch_size=64,
    seed=123,
    shuffle=False,
    class_mode="raw",
    target_size=(224, 224))

STEP_SIZE_VALID = valid_generator.n // valid_generator.batch_size

【讨论】:

    【解决方案2】:

    您可以通过对代码稍作更改来解决此问题。您可以再添加一个名为 test_datagen 的 ImageDataGenerator 对象,在该对象中您只会传递 rescale 参数而不会传递增强技术。因此,增强技术将位于不同的对象中,对您来说是它的数据生成器。您还必须在将训练和测试目录传递给训练和测试数据生成器之前拆分您的训练和测试目录。 我给你一个来自TensorFLow的示例代码,你也可以参考this

    #For traning data
    train_datagen = ImageDataGenerator(
            rescale=1./255,
            shear_range=0.2,
            zoom_range=0.2,
            horizontal_flip=True)
    #For testing data
    test_datagen = ImageDataGenerator(rescale=1./255)
    
    train_generator = train_datagen.flow_from_directory(
            'data/train',
            target_size=(150, 150),
            batch_size=32,
            class_mode='binary')
    validation_generator = test_datagen.flow_from_directory(
            'data/validation',
            target_size=(150, 150),
            batch_size=32,
            class_mode='binary')
    model.fit_generator(
            train_generator,
            steps_per_epoch=2000,
            epochs=50,
            validation_data=validation_generator,
            validation_steps=800)
    

    【讨论】:

    • 我不能使用目录中的流...我有一个数据框:(
    【解决方案3】:

    您应该会看到这个相关问题的答案:When using Data augmentation is it ok to validate only with the original images?

    它说在加载验证数据时使用带有空参数ImageDataGenerator,例如:

    train_gen = ImageDataGenerator(aug_params).flow_from_directory(train_dir)
    valid_gen = ImageDataGenerator().flow_from_directory(valid_dir)
    
    model.fit_generator(train_gen, validation_data=valid_gen)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      相关资源
      最近更新 更多