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