【问题标题】:LSTM with Attention getting weights?? Classifing documents based on sentence embedding带有注意力的 LSTM 获得权重?基于句子嵌入的文档分类
【发布时间】:2020-01-11 21:51:23
【问题描述】:

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

  • 是否必须在 LSTM 之后添加 TimeDistributed 密集层?

  • 而且,我如何从我的网络中检索注意力权重(用于可视化目的)? - 以便我知道哪个句子是“负责”文档被归类为 还是

比如说,我有 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 )?非常感谢您的帮助

【问题讨论】:

  • 它只是在model=Model(review_input, preds) 之后运行另一个模型吗?喜欢:attmodel = Model(review_input, outputs=[preds, l_att_sent]),然后将model 拟合为正在运行的predictions, att_weights = attmodel.predict(X)

标签: python keras lstm attention-model


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 2017-11-10
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多