具有注意力的 LSTM 获得权重?基于句子嵌入的文档分类

LSTM with Attention getting weights?? Classifing documents based on sentence embedding

我真的很难用 keras 使用 lstm 并在顶部添加 attention_layer 来构建用于文本分类的神经网络。我确定我很接近,但我很困惑:

比如说,我有 10 个文档,由 100 个句子组成,每个句子表示为 500 个元素的向量。所以我的包含句子序列的文档矩阵看起来像:X = np.array(Matrix).reshape(10, 100, 500)

文档应分类为相应的情绪 1=好; 0=不好 - 所以

y= [1,0,0,1,1]
yy= np.array(y)

我不需要嵌入层,因为每个文档的每个句子已经是一个稀疏向量。

注意力层取自:https://github.com/richliao/textClassifier/blob/master/textClassifierHATT.py

MAX_SENTS = 100
MAX_SENT_LENGTH = 500

review_input = Input(shape=(MAX_SENTS, MAX_SENT_LENGTH))
l_lstm_sent = LSTM(100, activation='tanh', return_sequences=True)(review_input)
l_att_sent = AttLayer(100)(l_lstm_sent)
preds = Dense(1, activation='softmax')(l_att_sent)
model = Model(review_input, preds)

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['acc'])
model.fit(X, yy, nb_epoch=10, batch_size=50)

所以我认为我的模型应该设置正确但我不太确定..但是我如何从中获得注意力权重(例如所以我知道哪个句子导致分类为 1)?帮助非常感谢

1.时间分布

在这种情况下,您不必将 Dense 换成 TimeDistributed,尽管这样做可能会快一点,尤其是如果您可以提供一个掩码来屏蔽掉LSTM 输出的很大一部分。

然而,Dense无论最后一个维度之前的形状是什么,都在最后一个维度上运行。

2。注意力权重

是的,正如您在评论中所建议的那样。您需要修改 AttLayer 它能够返回其输出和注意力权重。

return output, ait

然后创建一个包含预测和注意力权重张量的模型并获得它们的预测:

l_att_sent, l_att_sent = AttLayer(100)(l_lstm_sent)
...
predictions, att_weights = attmodel.predict(X)