具有注意力的 LSTM 获得权重?基于句子嵌入的文档分类
LSTM with Attention getting weights?? Classifing documents based on sentence embedding
我真的很难用 keras
使用 lstm
并在顶部添加 attention_layer
来构建用于文本分类的神经网络。我确定我很接近,但我很困惑:
我必须在 LSTM 之后添加一个 TimeDistributed
密集层吗?
而且,我如何从我的网络中检索注意力权重(用于可视化目的)? - 这样我就知道哪个句子是 'responsible' 该文档被分类为 good 或 bad?
比如说,我有 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)
我真的很难用 keras
使用 lstm
并在顶部添加 attention_layer
来构建用于文本分类的神经网络。我确定我很接近,但我很困惑:
我必须在 LSTM 之后添加一个
TimeDistributed
密集层吗?而且,我如何从我的网络中检索注意力权重(用于可视化目的)? - 这样我就知道哪个句子是 'responsible' 该文档被分类为 good 或 bad?
比如说,我有 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)