我在尝试将多个输入传递给模型时遇到了问题。模型有两个输入
- 噪声图像,形状为
(256, 256, 3)
- 输入图像,形状为
(256, 256, 3)
和一个输出
- 输出图像,形状为
(256, 256, 3)
我通过ImageDataGenerator
生成图像:
x_data_gen = ImageDataGenerator( horizontal_flip=True, validation_split=0.2)
我通过Python生成器生成样本:
def image_sampler(datagen, batch_size, subset="training"): for imgs in datagen.flow_from_directory('data/r_cropped', batch_size=batch_size, class_mode=None, seed=1, subset=subset): g_y = [] noises = [] bw_images = [] for i in imgs: # 将原始图像添加到预期输出中 g_y.append(i/255.0) noises.append(generate_noise(1, 256, 3)[0]) bw_images.append(iu_rgb2gray(i)) yield(np.array([noises, bw_images]), np.array(g_y))
当尝试用以下代码训练模型时:
generator.fit_generator( image_sampler(x_data_gen, 32), validation_data=image_sampler(x_data_gen,32,"validation"), epochs=EPOCHS, steps_per_epoch= 540, validation_steps=160 )
我收到了以下错误信息:
检查模型输入时出错:您传递给模型的Numpy数组列表大小与模型期望的不符。预期看到2个数组,但实际上得到了以下1个数组的列表
虽然错误信息很清楚,但我不知道如何修改生成过程来解决这个问题。
我尝试过:
yield([noises, bw_images], np.array(g_y))
但这不起作用,因为它会导致另一个错误:
AttributeError: ‘list’ object has no attribute ‘shape’
我遗漏了什么?
回答:
当您有多个输入/输出时,您应该将它们作为numpy数组的列表传递。因此,您的第二种方法是正确的,但在第二种方法中您忘记了将列表转换为numpy数组:
yield ([np.array(noises), np.array(bw_images)], np.array(g_y))
为了确保一切正确,更详细的方法是为输入和输出层选择名称。例如:
input_1 = layers.Input(# 其他参数, name='input_1')input_2 = layers.Input(# 其他参数, name='input_2')
然后,在您的生成器函数中像这样使用这些名称:
yield ({'input_1': np.array(noises), 'input_2': np.array(bw_images)}, {'output': np.array(g_y)})
通过这样做,您可以确保映射正确完成。