ValueError: Input 0 is incompatible with layer layer_1: expected ndim=3, found ndim=2

ValueError: Input 0 is incompatible with layer layer_1: expected ndim=3, found ndim=2

我正在尝试使用词嵌入和编码器-解码器架构构建文本摘要器。这是我第一次使用 Keras,我无法理解为什么 layer_1 需要 ndim=3。我无法弄清楚这一点。下面是我的代码:

vocab_size = 16828
n_embeddings = 200

def model_builder(embeds):
        model = keras.Sequential()
        model.add(Embedding(weights=[embeds], name="embedding_1", input_dim=vocab_size,
                            output_dim=n_embeddings))
        for i in range(3):
            lstm = LSTM(rnn_size, name="layer_%s" %(i))
            model.add(lstm)
            model.add(Dropout(prob, name="drop_%s" %(i)))
        model.add(Dense())
        model.add(Activation('softmax', name="activation"))
        return model

rnn_size = 200
prob = 0.5
encoder = model_builder(embedding)
encoder.compile(loss='categorical_crossentropy', optimizer='rmsprop')
enocder.save_weights('embeddings.pkl', overwrite=True)

非常感谢您的帮助。让我知道你们是否需要任何其他信息。提前谢谢你。

P.S。 Keras 后端是 Tensorflow.

你的问题出在这几行:

for i in range(3):
        lstm = LSTM(rnn_size, name="layer_%s" %(i))
        model.add(lstm)
        model.add(Dropout(prob, name="drop_%s" %(i)))

LSTM 默认情况下 returns 仅是其预测的最后一步 - 因此数据正在失去其顺序性质。在您的示例中 - 在第一次迭代后 LSTM 输出一个向量而不是一系列错误 - 这就是引发错误的原因。

为了解决这个问题,请尝试:

for i in range(2):
        lstm = LSTM(rnn_size, name="layer_%s" %(i), return_sequences=True)
        model.add(lstm)
        model.add(Dropout(prob, name="drop_%s" %(i)))
lstm = LSTM(rnn_size, name="layer_%s" %(i), return_sequences=False)
model.add(lstm)

我注意到的另一件事是您使用 Dense 的方式不正确。您应该提供输出神经元的数量:

model.add(Dense(nb_of_output_neurons))

干杯。