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

Python 当有多个输出时,如何修复ValueError(x和y应具有相同的长度)?,python,tensorflow,keras,multipleoutputs,Python,Tensorflow,Keras,Multipleoutputs,我正在建立一个模型,它有一个图像输入(130130,1)和三个输出,每个输出包含一个(10,1)向量,其中softmax单独应用 (灵感来源于J.古德费罗、雅罗斯拉夫·布拉托夫、朱利安·伊巴尔兹、萨夏·阿诺德和 Vinay D.Shet.使用深度卷积神经网络从街景图像中识别多个数字。CoRR,abs/1312.60822013。URL 遗憾的是,他们没有公布自己的网络) 但是我得到:值错误:x(图像张量)和y(标签)应该具有相同的长度。发现:x.shape=(1000130130,1),y.sh

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

(灵感来源于J.古德费罗、雅罗斯拉夫·布拉托夫、朱利安·伊巴尔兹、萨夏·阿诺德和 Vinay D.Shet.使用深度卷积神经网络从街景图像中识别多个数字。CoRR,abs/1312.60822013。URL 遗憾的是,他们没有公布自己的网络)

但是我得到:值错误:
x
(图像张量)和
y
(标签)应该具有相同的长度。发现:x.shape=(1000130130,1),y.shape=(31000,10)

但如果我将其更改为:

 [same as before]
 train_generator = train_datagen.flow(x_train,
              y_train, 
              batch_size=batch_size)
然后我得到:ValueError:检查模型目标时出错:传递给模型的Numpy数组列表的大小不是模型预期的大小。预计将看到3个阵列

  • 尺寸(x_系列)=(1000、130、130、1)
    • 其中,每个图像是(130、130、1),有1000个图像
  • 尺寸(y_系列)=(1000,3,10)
书中说应该是这样的,

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

但是,我不知道如何才能使输出和输入具有相同的长度?

多亏了@Djib2011。当我在文档中查找示例以便在字典中传递时,我注意到所有示例都使用
model.fit()
,而不是
model.fit\u generator()

所以我做了研究,发现对于单输入多输出的ImageDataGenerator,仍然有一个(自2016年开始开放!)。 悲惨的故事


因此,解决方案是使用
model.fit()
而不是
model.fit\u generator()

感谢@Djib2011。当我在文档中查找示例以便在字典中传递时,我注意到所有示例都使用
model.fit()
,而不是
model.fit\u generator()

所以我做了研究,发现对于单输入多输出的ImageDataGenerator,仍然有一个(自2016年开始开放!)。 悲惨的故事


因此,解决方案是使用
model.fit()
而不是
model.fit\u generator()

我以前使用过多输入多输出模型,第一种方法肯定是可行的。确保3个
y
数组(
y列[:,0,:]
,…)的形状均为
(1000,10)
。另外,按照您编写的方式,
train\u generator
有一个超出必要范围的
[
括号(这通常会导致语法错误,因此我猜您的实际代码中没有语法错误。感谢@Djib2011,对括号的敏锐观察,您是对的;)然而,正如我所说,第一种方法给了我一个错误,因为组合输出
[y1,y2,y3]
的长度与输入的长度不同,因为
[y1,y2,y3]
具有形状
(31000,10)
,即使我注意到每个y都具有形状
(1000,10)
[y1,y2,y3]
应该是一个包含3个数组的列表,我不知道为什么它会将其视为组合输入。如果我是你,我会尝试命名输出(例如
output1=keras.layers.Dense(10,activation=“softmax”,name='out1')
),然后尝试在字典中传递标签数组:
{out1':y1,'out2','out3':y3}
。也许这会有帮助……您可能还需要更改
模型。compile()
,以便它使用字典而不是列表,但我不确定。我以前使用过多输入和多输出模型,第一种方法肯定是可行的。确保3
y
数组(
y\u train[:,0,:]
,…)都有一个
(1000,10)
的形状。另外,您编写
列车生成器的方式比需要的多了一个
[
括号(这通常会引起语法错误,所以我猜您的实际代码中没有语法错误。谢谢@Djib2011,对括号的敏锐观察,您是对的;)然而,正如我所说,第一种方法给了我一个错误,因为组合输出
[y1,y2,y3]
的长度与输入的长度不同,因为
[y1,y2,y3]
具有形状
(31000,10)
,即使我注意到每个y都具有形状
(1000,10)
[y1,y2,y3]
应该是一个包含3个数组的列表,我不知道为什么它会将其视为组合输入。如果我是你,我会尝试命名输出(例如
output1=keras.layers.Dense(10,activation=“softmax”,name='out1')
),然后尝试在字典中传递标签数组:
{out1':y1,'out2','out3':y3}
。也许这会有帮助……您可能还需要更改
model.compile()
,以便使用字典而不是列表,但我不确定。
model = Model(inputs=[main_input, auxiliary_input], outputs= 
[main_output, auxiliary_output])