我正在尝试实现Attention
机制,以便通过从GitHub线程中获得很多帮助来使用Keras
生成抽象的文本摘要,其中有关该实现的讨论很多。我正在努力理解代码的某些非常基本的位以及为成功获得输出而需要修改的内容。我知道attention
是通过所有先前时间戳的所有隐藏状态生成的上下文向量的加权总和,这就是我们在下面尝试做的事情。
数据:
我得到了BBC新闻数据集,该新闻数据集由新闻文本和政治,娱乐和体育等各种类别的标题组成。
参数:
n_embeddings = 64
vocab_size = len(voabulary)+1
max_len = 200
rnn_size = 64
代码:
_input = Input(shape=(max_len,), dtype='int32')
embedding = Embedding(input_dim=vocab_size, output_dim=n_embeddings, input_length=max_len)(_input)
activations = LSTM(rnn_size, return_sequences=True)(embedding)
# compute importance for each step
attention = Dense(1, activation='tanh')(activations)
attention = Flatten()(attention)
attention = Activation('softmax')(attention)
attention = RepeatVector(units)(attention)
attention = Permute([2, 1])(attention)
# apply the attention
sent_representation = merge([activations, attention], mode='mul')
sent_representation = Lambda(lambda xin: K.sum(xin, axis=1))(sent_representation)
probabilities = Dense(max_len, activation='softmax')(sent_representation)
model = Model(input=_input, output=probabilities)
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=[])
print(model.summary())
我的问题:
Attention
进行分类,而我想生成一个文本序列(摘要),那么我应该如何利用sent_probabilites
进行解码以生成摘要? RepeatVector
是什么?是否用于获取时间戳activation
中每个单词的T
和注意力概率? Permute
层做什么的太多解释? Lambda(lambda xin: K.sum(xin, axis=1))(sent_representation)
的作用是什么? model.fit()
看起来如何?我创建了固定长度的X
和y
的填充序列。 我真的很感谢您能提供的任何帮助。在此先多谢。
最佳答案
我发现大多数研究都倾向于使用tensorflow来完成此任务,因为使用tensorflow实现seq2seq模型比使用keras模型要容易得多
这个blog详细介绍了如何以一种非常优化的方式构建文本摘要程序,它解释了一种dongjun-Lee,这是最容易实现的高效实现方式之一
Code可以在这里找到,可以在Google colab上实现,
如果您喜欢这个主意,可以检查所有blog series。
希望这可以帮助