flow_from_directory 可以从 Keras 的同一目录中获取训练数据和验证数据吗?
Can flow_from_directory get train and validation data from the same directory in Keras?
我从 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')
训练和验证有两个单独的目录。只是好奇我是否可以从同一目录而不是两个单独的目录中获取训练和验证数据?有例子吗?
您可以将 validation_split
参数(0 到 1 之间的数字)传递给 ImageDataGenerator
class 实例以将数据拆分为训练集和验证集:
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
设置了增强参数,那么通过使用此解决方案,训练图像和验证图像都将被增强。
上述解决方案要求您对训练集和验证集应用相同的扩充,这可能不是您想要的(您可能不想对验证数据应用剪切、旋转和缩放等)。来自同一文件夹的单独培训和验证扩充尚不可用。
请参阅 https://github.com/keras-team/keras/issues/5862 了解完整讨论(以及一些可能的处理方法)。人们通常求助于创建新文件夹进行验证的脚本,但这并不是这个问题的确切答案。
正如@dapperdan 提到的,@today 当前标记的解决方案意味着训练集和验证集都经过相同的转换;如果您不打算进行数据扩充,这很好。如果您想进行数据扩充,那么您可能需要转换训练数据并保留验证数据 'unaugmented'.
为此,您应该创建两个 ImageDataGenerators,并为适当的数据进行所需的转换;然后使用具有相同种子的 'flow_from_directory' select 个子集。
# 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)
种子 将确保数据以类似方式随机化。
datagen_train = tf.keras.preprocessing.image.ImageDataGenerator(
rescale=1./255,
validation_split=0.2,
rotation_range=20,
zoom_range=0.2,
horizontal_flip=True,
vertical_flip=True,
fill_mode='nearest')
datagen_val = tf.keras.preprocessing.image.ImageDataGenerator( rescale=1./255, validation_split=0.2)
train_generator = datagen_train.flow_from_directory(
data_root,
seed=66,
target_size=(IMAGE_SIZE, IMAGE_SIZE),
batch_size=BATCH_SIZE,
shuffle=True,
subset='training')
val_generator = datagen_val.flow_from_directory(
data_root,
seed=66,
target_size=(IMAGE_SIZE, IMAGE_SIZE),
batch_size=BATCH_SIZE,
shuffle=True,
subset='validation')
我从 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')
训练和验证有两个单独的目录。只是好奇我是否可以从同一目录而不是两个单独的目录中获取训练和验证数据?有例子吗?
您可以将 validation_split
参数(0 到 1 之间的数字)传递给 ImageDataGenerator
class 实例以将数据拆分为训练集和验证集:
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
设置了增强参数,那么通过使用此解决方案,训练图像和验证图像都将被增强。
上述解决方案要求您对训练集和验证集应用相同的扩充,这可能不是您想要的(您可能不想对验证数据应用剪切、旋转和缩放等)。来自同一文件夹的单独培训和验证扩充尚不可用。
请参阅 https://github.com/keras-team/keras/issues/5862 了解完整讨论(以及一些可能的处理方法)。人们通常求助于创建新文件夹进行验证的脚本,但这并不是这个问题的确切答案。
正如@dapperdan 提到的,@today 当前标记的解决方案意味着训练集和验证集都经过相同的转换;如果您不打算进行数据扩充,这很好。如果您想进行数据扩充,那么您可能需要转换训练数据并保留验证数据 'unaugmented'.
为此,您应该创建两个 ImageDataGenerators,并为适当的数据进行所需的转换;然后使用具有相同种子的 'flow_from_directory' select 个子集。
# 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)
种子 将确保数据以类似方式随机化。
datagen_train = tf.keras.preprocessing.image.ImageDataGenerator(
rescale=1./255,
validation_split=0.2,
rotation_range=20,
zoom_range=0.2,
horizontal_flip=True,
vertical_flip=True,
fill_mode='nearest')
datagen_val = tf.keras.preprocessing.image.ImageDataGenerator( rescale=1./255, validation_split=0.2)
train_generator = datagen_train.flow_from_directory(
data_root,
seed=66,
target_size=(IMAGE_SIZE, IMAGE_SIZE),
batch_size=BATCH_SIZE,
shuffle=True,
subset='training')
val_generator = datagen_val.flow_from_directory(
data_root,
seed=66,
target_size=(IMAGE_SIZE, IMAGE_SIZE),
batch_size=BATCH_SIZE,
shuffle=True,
subset='validation')