Keras中的Bi-LSTM注意模型

时间:2018-10-18 04:31:02

标签: python tensorflow machine-learning keras deep-learning

我正在尝试使用词嵌入的Bi-LSTM建立注意力模型。我碰到了How to add an attention mechanism in keras?https://github.com/philipperemy/keras-attention-mechanism/blob/master/attention_lstm.pyhttps://github.com/keras-team/keras/issues/4962

但是,我对Object[] resultArray = (Object[]) result.get(0); String rep = (String) resultArray[0]; 的实现感到困惑。所以,

Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification

在这里我对哪个方程与本文的方程感到困惑。

_input = Input(shape=[max_length], dtype='int32')

# get the embedding layer
embedded = Embedding(
        input_dim=30000,
        output_dim=300,
        input_length=100,
        trainable=False,
        mask_zero=False
    )(_input)

activations = Bidirectional(LSTM(20, return_sequences=True))(embedded)

# compute importance for each step
attention = Dense(1, activation='tanh')(activations)

RepeatVector会做什么?

attention = Flatten()(attention)
attention = Activation('softmax')(attention)

现在,我不确定这行为什么在这里。

attention = RepeatVector(20)(attention)
attention = Permute([2, 1])(attention)


sent_representation = merge([activations, attention], mode='mul')

由于我有两个课程,所以最终的softmax为:

sent_representation = Lambda(lambda xin: K.sum(xin, axis=-2), output_shape=(units,))(sent_representation)

1 个答案:

答案 0 :(得分:1)

注意= Flatten()(注意)
将您的注意力权重张量转换为向量(如果序列大小为max_length,则大小为max_length)。

attention = Activation('softmax')(attention)

允许所有注意权重在0和1之间,所有权重之和等于1。

attention = RepeatVector(20)(attention)
attention = Permute([2, 1])(attention)


sent_representation = merge([activations, attention], mode='mul')

RepeatVector用隐藏状态(20)的大小重复注意权重向量(大小为max_len),以便逐个元素地将激活和隐藏状态相乘。张量变量 activations 的大小为max_len * 20。

sent_representation = Lambda(lambda xin: K.sum(xin, axis=-2), output_shape=(units,))(sent_representation)

此Lambda层对加权的隐藏状态向量进行求和,以获得最终将使用的向量。

希望这对您有所帮助!