尝试将具有相同形状的keras中的两层连接起来,导致形状匹配错误

时间:2018-11-24 19:17:02

标签: python machine-learning keras neural-network lstm

我正在尝试使用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')

所以现在它们可以顺利连接了,但对我还是不清楚为什么?

1 个答案:

答案 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的输出相匹配,因此平滑地串联了