我有以下训练/验证代码:
# we create two instances with the same arguments
image_data_gen_args = dict(rotation_range=90.0, rescale=1/255.0)
mask_data_gen_args = dict(rotation_range=90.0, rescale=1/255.0)
train_image_datagen = ImageDataGenerator(**image_data_gen_args)
train_mask_datagen = ImageDataGenerator(**mask_data_gen_args)
validation_image_datagen = ImageDataGenerator()
validation_mask_datagen = ImageDataGenerator(**mask_data_gen_args)
# Provide the same seed flow methods
seed = 1
train_image_generator = train_image_datagen.flow_from_directory(
abs_parent_train_images_path,
class_mode=None,
seed=seed,
follow_links=True, # we symlinked the images to a temp directory
batch_size=1,
shuffle=True,
target_size=(image_size, image_size))
train_mask_generator = train_mask_datagen.flow_from_directory(
abs_parent_train_masks_path,
class_mode=None,
seed=seed,
batch_size=1,
shuffle=True,
target_size=(image_size, image_size),
color_mode="grayscale",
save_to_dir=abs_parent_train_masks_path)
validation_image_generator = validation_image_datagen.flow_from_directory(
abs_parent_test_images_path,
class_mode=None,
seed=seed,
follow_links=True, # we symlinked the images to a temp directory
batch_size=1,
shuffle=True,
target_size=(image_size, image_size))
validation_mask_generator = validation_mask_datagen.flow_from_directory(
abs_parent_test_masks_path,
class_mode=None,
seed=seed,
batch_size=1,
shuffle=True,
target_size=(image_size, image_size),
color_mode="grayscale",
save_to_dir=abs_parent_test_masks_path)
# combine generators into one which yields image and masks
train_generator = itertools.izip(train_image_generator, train_mask_generator)
validation_generator = itertools.izip(validation_image_generator, validation_mask_generator)
# test generators' saving
for idx, pair in enumerate(validation_generator):
print(idx)
print('iterating')
if idx >= 0:
break
modeler.model.fit_generator(generator=train_generator,
steps_per_epoch=1,
validation_data=validation_generator,
validation_steps=1,
epochs=1,
callbacks=callbacks_list,
verbose=1)
四个训练/验证目录在所需的directory/subdirectory/image
组织中具有 1 个映像或掩码,以便flow_from_directory
。 因此,目录结构被认为不是问题所在。 kera 在训练期间的打印输出进一步证实了这一点:
Found 1 images belonging to 1 classes.
Found 1 images belonging to 1 classes.
Found 1 images belonging to 1 classes.
Found 1 images belonging to 1 classes.
我注意到fit_generator
每次火车运行都会保存多个图像。 由于纪元、steps_per_epoch、validation_steps和图像/掩码的数量(用于训练/验证)都等于 1,因此我希望在调用fit_generator
期间只保存一张图像。 但是,该数字似乎是9(相同的图像,但每个图像具有不同的旋转)。
有趣的是,这似乎是fit_generator
而不是ImageDataGenerator
类的结果,因为我可以在for
循环迭代validation_generator
之后断点,并找到每次迭代保存的for
循环只保存一个图像(如预期的那样)。
我做错了什么吗? 这是预期行为(以及为什么)?
谢谢!
fit_generator
函数有两个附加参数,它们可能是观察到的行为的原因:
- 默认值
workers
=1
表示将使用额外的线程来加载图像。线程将从提供的生成器中获取图像并将它们放入队列中。 - 默认值
=10
的max_queue_size
是此队列的最大长度。当对fit_generator
的调用返回时,排队程序线程将停止,但在它继续用图像填充队列之前,即使不再需要其中一些图像也是如此。