【发布时间】: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