gpt4 book ai didi

python - 在 Keras 中连接两个目录迭代器

转载 作者:行者123 更新时间:2023-11-30 09:42:22 24 4
gpt4 key购买 nike

假设我有如下内容:

image_data_generator = ImageDataGenerator(rescale=1./255)

train_generator = image_data_generator.flow_from_directory(
'my_directory',
target_size=(28, 28),
batch_size=32,
class_mode='categorical'
)

然后我的 train_generator 填充了来自 my_directory 的数据,其中包含两个子文件夹,将数据分为类 01 .

假设我还有另一个目录 that_directory,也将数据分为类 01。我想用这些额外的数据来增强我的 train_generator

运行 train_generator = image_data_generator.flow_from_directory('that_directory', ...) 会从 my_directory 中删除先前的数据。

有没有一种方法可以将两组数据扩充或附加到一个生成器或像 DirectoryIterator 一样操作的对象中,而无需更改文件夹结构本身?

最佳答案

只需将生成器组合到另一个生成器中,可以选择使用不同的增强配置:

idg1 = ImageDataGenerator(**idg1_configs)
idg2 = ImageDataGenerator(**idg2_configs)

g1 = idg1.flow_from_directory('idg1_dir',...)
g2 = idg2.flow_from_directory('idg2_dir',...)

def combine_gen(*gens):
while True:
for g in gens:
yield next(g)

# ...
model.fit_generator(combine_gen(g1, g2), steps_per_epoch=len(g1)+len(g2), ...)

这将交替从 g1 生成批处理和g2 .

请注意,有人可能建议使用 itertools.chain ,但是你不能在这里使用它,因为 ImageDataGenerators生成器永无止境,不断生成批量数据。这对于您传递给 fit_generator 的生成器来说是预期的方法。来自 Keras doc :

...The generator is expected to loop over its data indefinitely. An epoch finishes when steps_per_epoch batches have been seen by the model.

steps_per_epoch如果未设置,则默认为 len(generator)哪里generator是您传递给 fit_generator 的生成器方法。 ImageDataGenerator生成器可以给出它们的长度,因此您不需要手动设置 steps_per_epoch争论。如果您希望使用上面的组合生成器实现同样的效果,则可以使用此解决方案:

class CombinedGen():
def __init__(self, *gens):
self.gens = gens

def generate(self):
while True:
for g in self.gens:
yield next(g)

def __len__(self):
return sum([len(g) for g in self.gens])

# usage:
cg = CombinedGen(g1, g2)
model.fit_generator(cg.generate(), ...) # no need to set `steps_per_epoch`

您还可以添加__next__和/或__iter__方法CombinedGen class 如果您有兴趣直接迭代此类的对象(而不是迭代 cg.generate() )。

关于python - 在 Keras 中连接两个目录迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57205451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com