keras list of Numpy arrays not the size model expected

我在尝试将多个输入传递给模型时遇到了问题。模型有两个输入

  • 噪声图像,形状为(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)})

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

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注