numpy数组的keras列表,而不是预期的大小模型

Sto*_*son 4 python machine-learning neural-network keras tensorflow

我很难找到将多个输入传递给模型的正确方法。该模型有2个输入

  • 形状的噪声图像 (256, 256, 3)
  • 形状的输入图像 (256, 256, 3)

和1个输出

  • 输出形状的图像 (256, 256, 3)

我正在通过生成图像ImageDataGenerator

x_data_gen = ImageDataGenerator(
    horizontal_flip=True,
    validation_split=0.2)
Run Code Online (Sandbox Code Playgroud)

我正在通过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:
            # append to expected output the original image
            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))
Run Code Online (Sandbox Code Playgroud)

尝试使用以下方法训练模型时:

    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 )
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息:

检查模型输入时出错:传递给模型的Numpy数组列表不是模型预期的大小。预计会看到2个数组,但获得了以下1个数组的列表

虽然消息很清楚,但我不知道如何解决生成过程来解决它。

我试过了:

    yield([noises, bw_images], np.array(g_y))
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为它将遇到另一个错误:

AttributeError:“列表”对象没有属性“形状”

我想念什么?

tod*_*day 6

当您有多个输入/输出时,应将它们作为numpy数组的列表传递。所以您的第二种方法是正确的,但是您忘记了在第二种方法中将列表转换为numpy数组:

yield ([np.array(noises), np.array(bw_images)], np.array(g_y))
Run Code Online (Sandbox Code Playgroud)

确保所有内容正确的一种更冗长的方法是为输入和输出层选择名称。例:

input_1 = layers.Input(# other args, name='input_1')
input_2 = layers.Input(# other args, name='input_2')
Run Code Online (Sandbox Code Playgroud)

然后,在生成器函数中使用如下名称:

yield ({'input_1': np.array(noises), 'input_2': np.array(bw_images)}, {'output': np.array(g_y)})
Run Code Online (Sandbox Code Playgroud)

这样,您可以确保映射正确完成。