3

我试图掌握分层注意力网络(HAN)的概念,我在网上找到的大部分代码都或多或少类似于这里的代码:https ://medium.com/jatana/report-on-text-分类-使用-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 的输出吗?在这种情况下,它应该是一个浮点数,或者如果它是另一层嵌入的单词,那么它也应该用嵌入层包裹。

4

2 回答 2

1

Masoud 的回答是正确的,但我会在这里用我自己的话重写它:

  • 数据 (X_train) 作为模型的索引输入并由 input2 接收
  • 然后 X_train 被转发到编码器模型并由 input1 接收
  • input1 被嵌入层包裹,因此索引被转换为向量

所以 input2 更像是模型输入的代理。

于 2019-04-07T17:32:22.603 回答
1

HAN 模型在层次结构中处理文本:它需要一个已经分成句子的文档(这就是形状input2is的原因(MAX_SENTS,MAX_SENT_LENGTH));然后它使用sentEncoder模型独立处理每个句子(这就是形状input1is的原因(MAX_SENT_LENGTH,)),最后它一起处理所有编码的句子。

因此,在您的代码中,整个模型都存储在其中model,它的输入层是input2您将提供的文档,这些文档已被拆分为句子,并且它们的单词已被整数编码(以使其与嵌入层兼容)。另一个输入层属于在sentEncoder内部使用的模型model(而不是由您直接使用):

review_encoder = TimeDistributed(sentEncoder)(review_input)
于 2019-04-06T12:12:55.810 回答