动态分割训练集时避免在验证集上增加数据

时间:2020-11-12 01:46:04

标签: python-3.x tensorflow keras

嗨,我有一个jpg图像数据集,我在Tensorflow中使用Keras。 我的数据集有2个子目录: training test 。 我想在 validation 部分中动态拆分我的 training 。 我已经看到ImageDataGenerator有一个名为validation_split的方法。 我的问题是我也想仅在其余的 training 部分上应用数据增强。

这是代码(它还在 validation 部分应用数据增强)

apply_data_augmentation = True

if apply_data_augmentation:
  train_data_gen = ImageDataGenerator(rotation_range=10,
                                      width_shift_range=10,
                                      height_shift_range=10,
                                      zoom_range=0.3,
                                      horizontal_flip=True,
                                      vertical_flip=True,
                                      fill_mode='constant',
                                      cval=0,
                                      shear_range=0.2,
                                      rescale=1./255,
                                      validation_split=0.2)#means 20% of training is splitted dinamically into validation
else:
  train_data_gen = ImageDataGenerator(rescale=1./255,
                                      validation_split=0.2)
  
train_gen = train_data_gen.flow_from_directory(training_dir,
                                               target_size=(image_h, image_w),
                                               batch_size=bs,
                                               subset='training',
                                               class_mode='categorical',
                                               shuffle=True,
                                               classes=['NO_MASK','ALL_MASK','SOME_MASK'],
                                               seed=SEED,
                                               color_mode="rgb")

valid_data_gen = ImageDataGenerator(rescale=1./255)

valid_gen = train_data_gen.flow_from_directory(validation_dir,
                                               target_size=(image_h, image_w),
                                               batch_size=bs,
                                               subset='validation',
                                               class_mode='categorical',
                                               shuffle=True,
                                               classes=['NO_MASK','ALL_MASK','SOME_MASK'],
                                               seed=SEED,
                                               color_mode="rgb")

谢谢。

1 个答案:

答案 0 :(得分:-1)

我很困惑,您有单独的培训和验证目录吗?如果这样做,则创建两个单独的生成器以进行培训和验证。

valid_gen = ImageDataGenerator(rescale=1/255).flow_from_directory(validation_dir,                                               
                                               target_size=(image_h, image_w),
                                               batch_size=bs,
                                               subset=None
                                               class_mode='categorical',
                                               shuffle=False,
                                               classes=['NO_MASK','ALL_MASK','SOME_MASK'],
                                               seed=SEED,
                                               color_mode="rgb")

删除train_data_gen中的验证拆分参数。如果您所有的图像都在训练目录中,则对于有效代码,请使用以下代码。

valid_gen = ImageDataGenerator(rescale=1/255, 
                               validation_split=0.2).flow_from_directory(training_dir,
                                               target_size=(image_h, image_w),
                                               batch_size=bs,
                                               subset='validation',
                                               class_mode='categorical',
                                               shuffle=False,
                                               classes=['NO_MASK','ALL_MASK','SOME_MASK'],
                                               seed=SEED,
                                               color_mode="rgb")

对于train_gen,请使用您拥有的代码。确保在第二种情况下,在train_gen和valid_gen中使用相同的种子值。为了进行验证,最好将shuffle = False设置为相同的图像 在每个时期使用相同的顺序进行验证。