我正在尝试使用keras functional api构建多输入多输出模型,但是我遵循了他们的代码,但是出现了这个错误:
ValueError:
Concatenate
层需要具有匹配项的输入 连接轴以外的其他形状。得到了输入形状:[(无,50), (无,50、1)]
我跳过了嵌入层,这是代码:
def build_model(self):
main_input = Input(shape=(self.seq_len, 1), name='main_input')
print(main_input.shape)
# seq_len = 50
# A LSTM will transform the vector sequence into a single vector,
# containing information about the entire sequence
lstm_out = LSTM(self.seq_len,input_shape=(self.seq_len,1) )(main_input)
self.auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)
auxiliary_input = Input(shape=(self.seq_len,1), name='aux_input')
print(auxiliary_input.shape)
x = concatenate([lstm_out, auxiliary_input])
# We stack a deep densely-connected network on top
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
# And finally we add the main logistic regression layer
main_output = Dense(1, activation='sigmoid', name='main_output')(x)
self.model = Model(inputs=[main_input, auxiliary_input], outputs=[main_output, auxiliary_output])
print(self.model.summary())
self.model.compile(optimizer='rmsprop', loss='binary_crossentropy',
loss_weights=[1., 0.2])
尽管在印刷中两层的形状均为(?,50,1),但在连接步骤中却遇到了该错误。
我不确切知道为什么得到这个,第一层的input_shape到底有什么错误,为什么它不能像使用print(main_input.shape)
那样给我带来相同的形状,以及如何解决呢?
更新:
我通过更改第二个输入层的形状找到了解决错误的方法
auxiliary_input = Input(shape=(self.seq_len,), name='aux_input')
所以现在它们可以顺利连接了,但对我还是不清楚为什么?
答案 0 :(得分:1)
对于第二个输入,您在错误之前指定了
input_shape = (50,1)# seq_length=50
这意味着最终形状为:
(None,50,1)
现在,当第一个输入通过LSTM
时,由于您未指定return_sequences=True
,它将返回形状为(batch_size, units)
的张量。您要与上述(None, 50)
(None, 50, 1)
您的错误消失了,因为您将第二个输入的输入形状更改为(50,)
,因此最终形状变成了(None,50)
,它与LSTM
的输出相匹配,因此平滑地串联了>