Keras:flow_from_directory通话期间保存了太多图像fit_generator



我有以下训练/验证代码:

# 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表示将使用额外的线程来加载图像。线程将从提供的生成器中获取图像并将它们放入队列中。
  • 默认值=10max_queue_size是此队列的最大长度。当对fit_generator的调用返回时,排队程序线程将停止,但在它继续用图像填充队列之前,即使不再需要其中一些图像也是如此。

最新更新