我真的很难用keras构建一个神经网络,使用lstm进行文本分类,并在顶部添加一个attention_layer。我确信我离得很近,但我很困惑:
TimeDistributed 稠密层,如何从我的网络中检索注意力权重(为了可视化目的)?--这样我就知道哪个句子对文档被归类为好的或坏的负有“责任”。
比如说,我有10个文档,由100个句子组成,每个句子都表示为一个500元素向量。因此,包含句子序列的文档矩阵如下所示:X = np.array(Matrix).reshape(10, 100, 500)
这些文件应按情意1=good;0=bad - so分类。
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的分类)?非常感谢的帮助
发布于 2020-01-13 10:21:28
1.时间分布
在这种情况下,您不需要将Dense封装到TimeDistributed中,尽管这样做可能要快一些,特别是如果您可以提供一个掩码来掩盖大部分TimeDistributed输出的话。
然而,无论最后一个维度之前的形状是什么,Dense都在最后一个维度中运行。
2.注意权重
是的,正如你在评论中所建议的那样。您需要修改AttLayer,它能够返回输出和注意力权重。
return output, ait然后创建一个包含预测和注意力权重张量的模型,并得到它们的预测:
l_att_sent, l_att_sent = AttLayer(100)(l_lstm_sent)
...
predictions, att_weights = attmodel.predict(X)https://stackoverflow.com/questions/59698951
复制相似问题