ValueError:输入0与图层layer_1不兼容:预期ndim = 3,找到ndim = 2

时间:2018-01-22 02:00:37

标签: python-3.x keras keras-layer

我正在尝试使用单词嵌入和编码器 - 解码器架构来构建文本摘要器。这是我在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

1 个答案:

答案 0 :(得分:1)

你的问题在于以下几点:

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仅返回其预测的最后一步 - 因此数据正在失去其顺序性质。在您的示例中 - 在第一次迭代后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))

干杯。