flow_from_directory 可以从 Keras 的同一目录中获取训练和验证数据吗?

Posted

技术标签:

【中文标题】flow_from_directory 可以从 Keras 的同一目录中获取训练和验证数据吗?【英文标题】:Can flow_from_directory get train and validation data from the same directory in Keras? 【发布时间】:2019-04-01 21:55:09 【问题描述】:

我从here得到以下示例。

train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)

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')

训练和验证有两个单独的目录。只是好奇我是否可以从同一个目录而不是两个单独的目录中拆分训练和验证数据?有什么例子吗?

【问题讨论】:

【参考方案1】:

您可以将 validation_split 参数(介于 0 和 1 之间的数字)传递给 ImageDataGenerator 类实例,以将数据拆分为训练集和验证集:

generator = ImagaDataGenerator(..., validation_split=0.3)

然后将subset 参数传递给flow_from_directory 以指定训练和验证生成器:

train_gen = generator.flow_from_directory(dir_path, ..., subset='training')
val_gen = generator.flow_from_directory(dir_path, ..., subset='validation')

注意:如果您为ImageDataGenerator 设置了增强参数,那么通过使用此解决方案,训练和验证图像都将得到增强。

【讨论】:

【参考方案2】:

上述解决方案要求您对训练和验证集应用相同的增强,这可能是不希望的(您可能不想对验证数据应用剪切、旋转和缩放等)。来自同一文件夹的单独训练和验证增强尚不可用。

请参阅https://github.com/keras-team/keras/issues/5862 进行完整讨论(以及一些可能的处理方法)。人们通常求助于创建新文件夹进行验证的脚本,但这并不是这个问题的确切答案。

【讨论】:

【参考方案3】:

正如@dapperdan 提到的,@today 当前标记的解决方案意味着训练集和验证集都经历了相同的转换;如果您不打算进行数据增强,这很好。如果您想进行数据增强,那么您可能希望转换训练数据并让验证数据保持“未增强”状态。

为此,您应该创建两个 ImageDataGenerators,并为相应的数据进行所需的转换;然后使用具有相同种子的 'flow_from_directory' 选择子集。

# Validation ImageDataGenerator with rescaling.
valid_datagen = ImageDataGenerator(rescale=1./255, validation_split=0.2)
# Training ImagaDataGenerator with Augmentation transf.  
train_datagen = ImageDataGenerator(rescale=1./255, validation_split=0.2,\
                                   rotation_range=15, shear_range=10,\
                                   zoom_range=0.1, fill_mode='nearest', \
                                   height_shift_range=0.05, width_shift_range=0.1)

# Create a flow from the directory for validation data - seed=42
# Choose subset = 'validation'
valid_gen = valid_datagen.flow_from_directory(dir_path, subset='validation',\
                                              shuffle=True, seed=42, 
                                              target_size=img_shape,\
                                              batch_size=64)
# Create a flow from the directory using same seed and 'training' subset.
train_gen = train_datagen.flow_from_directory(dir_path, subset='training',\
                          shuffle=True, seed=42, target_size=img_shape,\
                          batch_size=64)

【讨论】:

您是否做过任何测试以确保没有泄漏/重叠?

以上是关于flow_from_directory 可以从 Keras 的同一目录中获取训练和验证数据吗?的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow2中ImageDataGenerator中flow_from_directory()和image_dataset_from_directory()区别

我可以在 Keras 中使用 ImageDataGenerator() 和 flow_from_directory() 生成 uint8 标签吗?

Keras - .flow_from_directory(目录)

Keras - .flow_from_directory(目录)

Keras image_gen.flow_from_directory() 中的 class_mode 参数表示啥?

如何使用 keras flow_from_directory shuffled 方法检索图像的文件名?