LSTM с акцентом на получение веса ?? Классификация документов на основе вложения предложений - PullRequest
0 голосов
/ 12 января 2020

Я действительно застрял в создании NN для классификации текста с keras с использованием lstm и добавлением attention_layer сверху. Я уверен, что я довольно близок, но я в замешательстве:

  • Должен ли я добавить плотный слой TimeDistributed после LSTM?

  • И как мне получить веса внимания из моей сети (для наглядности)? - чтобы я знал, какое предложение было «ответственным» за то, чтобы документ был классифицирован как хороший или плохо ?

Скажем, у меня есть 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 Ответ

1 голос
/ 13 января 2020

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)
...