如何在有多个输出的同时修复ValueError(x和y应该具有相同的长度)?

时间:2019-06-23 16:04:05

标签: python tensorflow keras multipleoutputs

我正在建立一个模型,该模型具有一个图像输入(130,130,1)和3个输出,每个输出包含一个(10,1)向量,其中单独应用softmax。

  

(受J. Goodfellow,Yaroslav Bulatov,Julian Ibarz,Sacha Arnoud和   Vinay D. Shet。使用深度卷积神经网络从街景图像中进行多位数数字识别。 CoRR,abs / 1312.6082,2013年。URL   http://arxiv.org/abs/1312.6082,可惜他们没有发布他们的网络。

input = keras.layers.Input(shape=(130,130, 1)
l0 = keras.layers.Conv2D(32, (5, 5), padding="same")(input)
[conv-blocks etc]
l12 = keras.layers.Flatten()(l11)
l13 = keras.layers.Dense(4096, activation="relu")(l12)
l14 = keras.layers.Dense(4096, activation="relu")(l13)
output1 = keras.layers.Dense(10, activation="softmax")(l14)
output2 = keras.layers.Dense(10, activation="softmax")(l14)
output3 = keras.layers.Dense(10, activation="softmax")(l14)

model = keras.models.Model(inputs=input, outputs=[output1, output2, output3])
model.compile(loss=['categorical_crossentropy', 'categorical_crossentropy', 
              'categorical_crossentropy'],
              loss_weights=[1., 1., 1.],
              optimizer=optimizer,
              metrics=['accuracy'])

train_generator = train_datagen.flow(x_train,
              [[y_train[:, 0, :], y_train[:, 1, :], y_train[:, 2, :]], 
              batch_size=batch_size)

但是随后我得到: ValueError:x(图像张量)和y(标签)应该具有相同的长度。找到:x.shape =(1000,130,130,1),y.shape =(3,1000,10)

但是如果我将其更改为:

 [same as before]
 train_generator = train_datagen.flow(x_train,
              y_train, 
              batch_size=batch_size)

然后我得到: ValueError:检查模型目标时出错:传递给模型的Numpy数组列表不是模型期望的大小。预计会看到3个数组

  • dimension(x_train)=(1000,130,130,1)
    • 每个单张图片分别为(130、130、1),并且有1000张图片
  • dimension(y_train)=(1000,3,10)

documentation中指出应该是这样;

model = Model(inputs=[main_input, auxiliary_input], outputs= 
[main_output, auxiliary_output])

但是,我不知道您应该如何具有相同的输出和输入长度?

1 个答案:

答案 0 :(得分:0)

感谢@ Djib2011。当我在文档中查找示例以将其传递到字典中时,我指出所有示例都使用model.fit()而不是model.fit_generator()

因此,我进行了研究,发现还有一个 bug (自2016年开始营业!)具有单个输入和多个输出的ImageDataGenerator 。 悲伤的故事。

因此解决方案是使用model.fit()而不是model.fit_generator()