我如何结合两个 keras 生成器功能

azu*_*e31 5 python computer-vision neural-network keras

我正在尝试在 Keras 中实现一个 Siamese 网络,并且我想使用 Keras 图像数据生成器将图像转换应用于 2 个输入图像。根据文档中的示例- https://keras.io/preprocessing/image/,我尝试像这样实现它-

datagen_args = dict(rotation_range=10,
                    width_shift_range=0.1,
                    height_shift_range=0.1,
                    horizontal_flip=True)

in_gen1 = ImageDataGenerator(**datagen_args)
in_gen2 = ImageDataGenerator(**datagen_args)

train_generator = zip(in_gen1, in_gen2)

model.fit(train_generator.flow([pair_df[:, 0,::],pair_df[:, 1,::]],
                          y_train,batch_size=16), epochs, verbose = 1)
Run Code Online (Sandbox Code Playgroud)

但是这段代码抛出了这个错误:

类型错误 : zip 参数 #1 必须支持迭代

我已经尝试itertools.izip按照Keras - Generator for large dataset of Images and Masks 中的建议使用但这会引发相同的错误。

我该如何解决?

编辑:如果有人感兴趣,这终于奏效了-

datagen_args = dict(
    featurewise_center=False,
    rotation_range=10,
    width_shift_range=0.1,
    height_shift_range=0.1,
    horizontal_flip=True)

in_gen1 = ImageDataGenerator(**datagen_args)
in_gen2 = ImageDataGenerator(**datagen_args)

in_gen1 = in_gen1.flow(pair_df[:, 0,::], y_train, batch_size = 16, shuffle = False)
in_gen2 = in_gen2.flow(pair_df[:, 1,::], y_train, batch_size = 16, shuffle = False)

for e in range(epochs):
    batches = 0
    for x1, x2 in itertools.izip(in_gen1,in_gen2):
    # x1, x2 are tuples returned by the generator, check whether targets match
        assert sum(x1[1] != x2[1]) == 0  
        model.fit([x1[0], x2[0]], x1[1], verbose = 1)
        batches +=1
        if(batches >= len(pair_df)/16):
            break
Run Code Online (Sandbox Code Playgroud)

Har*_*ini 6

使用zip()组合生成器会生成无限迭代器。使用这个代替:

def combine_generator(gen1, gen2):
    while True:
        yield(next(gen1), next(gen2))
Run Code Online (Sandbox Code Playgroud)

修改后的代码看起来像这样:

datagen_args = dict(rotation_range=10,
                    width_shift_range=0.1,
                    height_shift_range=0.1,
                    horizontal_flip=True)

in_gen1 = ImageDataGenerator(**datagen_args)
in_gen2 = ImageDataGenerator(**datagen_args)

def combine_generator(gen1, gen2):
    while True:
        yield(next(gen1), next(gen2))

train_generator = combine_generator(in_gen1, in_gen2)

model.fit(train_generator.flow([pair_df[:, 0,::],pair_df[:, 1,::]],
                          y_train,batch_size=16), epochs, verbose = 1)
Run Code Online (Sandbox Code Playgroud)

请参阅此线程以获取更多参考。