model.fit前如何拼接两个generator对象并解决单输入收双张量报错
问题原因
你的报错核心是:当前合并生成器输出了包含2个张量的列表,而你使用的new_model是单输入结构,仅能接收1组图像张量作为输入。
你原本的需求是将「归一化原图」和「增强生成图」合并为更大的训练样本集,而非作为两组独立输入送入模型,所以错误出在合并生成器的返回逻辑上。
修复方案
修改合并生成器的逻辑,将两个生成器产出的图像张量、标签张量在样本维度(第0维)拼接,作为单组输入返回:
# 两个合并生成器逻辑完全一致,可以复用同一个函数 def combine_generator(gen1, gen2): while True: data1 = gen1.next() data2 = gen2.next() # 沿样本维度拼接图像:两个batch的样本合并为一个更大的batch combined_x = np.concatenate([data1[0], data2[0]], axis=0) # 对应拼接标签 combined_y = np.concatenate([data1[1], data2[1]], axis=0) yield combined_x, combined_y # 生成器初始化时添加相同seed,保证样本读取顺序一致,避免标签错位 train_generator1 = train_datagen1.flow_from_directory( train_path, save_to_dir="train_augm/", target_size=(224, 224), batch_size=6, seed=123) # 添加固定seed train_generator2 = train_datagen2.flow_from_directory( train_path, target_size=(224, 224), batch_size=6, seed=123) # 和上面同一个seed validation_generator1 = validation_datagen1.flow_from_directory( valid_path, save_to_dir="valid_augm/", target_size=(224, 224), batch_size=3, seed=456) # 验证集用另一个固定seed validation_generator2 = validation_datagen2.flow_from_directory( valid_path, target_size=(224, 224), batch_size=3, seed=456) # 和上面同一个seed # 调用合并函数 train_generator = combine_generator(train_generator1, train_generator2) validation_generator = combine_generator(validation_generator1, validation_generator2) # 训练时手动指定步数,keras无法自动推断自定义生成器的步数 train_steps = train_generator1.samples // train_generator1.batch_size val_steps = validation_generator1.samples // validation_generator1.batch_size history = new_model.fit( train_generator, epochs=5, steps_per_epoch=train_steps, validation_data = validation_generator, validation_steps=val_steps, shuffle = True, verbose = 1)
注意事项
- 合并后的每个训练batch大小为两个生成器batch大小之和,上面的示例中训练batch总大小为6+6=12,验证batch总大小为3+3=6
- 如果不需要每个batch同时包含原图和增强图,也可以直接先后用两个生成器训练,效率更高
内容的提问来源于stack exchange,提问作者Ayhan Sarı
相关产品推荐
相关产品推荐

