Что представляют собой входные слои в иерархической сети внимания - PullRequest
3 голосов
/ 06 апреля 2019

Я пытаюсь понять идею Иерархической сети внимания (HAN), большая часть кода, который я нахожу в сети, более или менее похожа на приведенную здесь: https://medium.com/jatana/report-on-text-classification-using-cnn-rnn-han-f0e887214d5f:

embedding_layer=Embedding(len(word_index)+1,EMBEDDING_DIM,weights=[embedding_matrix],
input_length=MAX_SENT_LENGTH,trainable=True)
sentence_input = Input(shape=(MAX_SENT_LENGTH,), dtype='int32', name='input1')
embedded_sequences = embedding_layer(sentence_input)
l_lstm = Bidirectional(LSTM(100))(embedded_sequences)
sentEncoder = Model(sentence_input, l_lstm)

review_input = Input(shape=(MAX_SENTS,MAX_SENT_LENGTH), dtype='int32',  name='input2')
review_encoder = TimeDistributed(sentEncoder)(review_input)
l_lstm_sent = Bidirectional(LSTM(100))(review_encoder)
preds = Dense(len(macronum), activation='softmax')(l_lstm_sent)
model = Model(review_input, preds)

Мой вопрос: что представляют здесь входные слои? Я предполагаю, что input1 представляет предложения, обернутые слоем внедрения, но в таком случае что такое input2? Это вывод sendEncoder? В этом случае это должен быть float, или если это другой слой встроенных слов, то он должен быть также обернут слоем для встраивания.

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

Ответ Масуда верен, но я напишу его здесь своими словами:

  • Данные (X_train) подаются в качестве индексов для модели и принимаются input2
  • X_train затем передается в модель кодера и принимается input1
  • input1 обернут слоем внедрения, поэтому индексы конвертируются к векторам

Таким образом, input2 - это скорее прокси входа модели.

1 голос
/ 06 апреля 2019

Модель HAN обрабатывает текст в иерархии: он принимает документ, уже разбитый на предложения (поэтому форма input2 равна (MAX_SENTS,MAX_SENT_LENGTH)); затем он обрабатывает каждое предложение независимо, используя модель sentEncoder (поэтому форма input1 равна (MAX_SENT_LENGTH,)), и, наконец, обрабатывает все закодированные предложения вместе.

Таким образом, в вашем коде вся модель хранится в model, а ее входной слой - input2, который вы бы подали с документами, которые были разбиты на предложения, а их слова были закодированы целым числом (чтобы сделать его совместимым с слой встраивания). Другой входной слой относится к модели sentEncoder, которая используется внутри model (а не напрямую вами):

review_encoder = TimeDistributed(sentEncoder)(review_input)
...