Я действительно застрял в создании 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)? Помощь очень ценится
model=Model(review_input, preds)
? Типа:attmodel = Model(review_input, outputs=[preds, l_att_sent])
, а затем установкаmodel
на работающийpredictions, att_weights = attmodel.predict(X)
? - person Felix   schedule 12.01.2020