How do I combine two keras generator functions(如何组合两个 keras 生成器功能)
问题描述
I am trying to implement a Siamese network in Keras and I want to apply image transformations to the 2 input images using Keras Image Data Generators. As per the example in the docs- https://keras.io/preprocessing/image/, I've tried to implement it like this-
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)
But this code throws this error:
TypeError: zip argument #1 must support iteration
I've tried using itertools.izip as suggested in Keras - Generator for large dataset of Images and Masks but this throws the same error.
How do I resolve this?
EDIT: In case anyone is interested, this worked finally-
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
Using zip() to combine generators leads to generation of an infinite iterator.
Use this instead:
def combine_generator(gen1, gen2):
while True:
yield(next(gen1), next(gen2))
Modified code would look something like this:
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)
See this thread for further reference.
这篇关于如何组合两个 keras 生成器功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何组合两个 keras 生成器功能
基础教程推荐
- 在 Python 中将货币解析为数字 2022-01-01
- 比较两个文本文件以找出差异并将它们输出到新的文本文件 2022-01-01
- 究竟什么是“容器"?在蟒蛇?(以及所有的 python 容器类型是什么?) 2022-01-01
- Kivy 使用 opencv.调整图像大小 2022-01-01
- Python,确定字符串是否应转换为 Int 或 Float 2022-01-01
- 在 Django Admin 中使用内联 OneToOneField 2022-01-01
- Python 中是否有任何支持将长字符串转储为块文字或折叠块的 yaml 库? 2022-01-01
- matplotlib 设置 yaxis 标签大小 2022-01-01
- kivy 应用程序中的一个简单网页作为小部件 2022-01-01
- 对多索引数据帧的列进行排序 2022-01-01
