如何在压缩两个可迭代项时获得下一次迭代



当标签本身是图像时,我需要训练一个模型。我想对输入图像和输出图像应用相同的数据增强。根据这个答案,我压缩了两个生成器:

# create augmentation generators for the input images and label images
image_datagen = ImageDataGenerator(rotation_range=45, width_shift_range=0.2, height_shift_range=0.2, brightness_range=(0.5,1.5),
fill_mode="reflect", horizontal_flip=True ,zoom_range=0.3,preprocessing_function = self.apply_kernels)
desity_datagen = ImageDataGenerator(rotation_range=45, width_shift_range=0.2, height_shift_range=0.2, brightness_range=(0.5,1.5),
fill_mode="reflect", horizontal_flip=True ,zoom_range=0.3,preprocessing_function = self.apply_kernels)
image_generator = image_datagen.flow_from_directory(self.train_data_dir, batch_size=batch_size, class_mode=None, seed=seed)
density_generator = desity_datagen.flow_from_directory(self.train_label_dir, batch_size=batch_size, class_mode=None, seed=seed)
# Combine the image and label generator
self.train_generator = zip(image_generator, density_generator)

我在一个生成器calss中构建了它,我使用初始化它

gen = data_generator(path_to_images, path_to_labels, batch_size);

我不包括全班同学,因为我不确定是否需要。如果需要,我会编辑并添加它。我正试图从两个生成器调用下一批,看看它是否有效:

image,label = gen.train_generator.next()
print(labels.shape)

我得到

属性错误:"zip"对象没有属性"next"

我理解我为什么得到它,尽管我不知道如何得到一批。

使用list(gen.train_generator)对内存来说太大。

您应该使用内置函数next-

value = next(gen.train_generator)

如果没有下一个值,next将抛出StopIteration异常。确保包装在try-except中以防止错误冒泡-

try:
value = next(gen.train_generator)
except StopIteration:
value = None

由于这种模式非常常见,next接受一个次要参数,以便在生成器耗尽时使用-

value = next(gen.train_generator, None) # default to None if generator is exhausted

这将执行您想要的操作:

gen.train_generator.__next__()

尽管@OlvinRoght的评论/回答更简洁。

相关内容

  • 没有找到相关文章

最新更新