Keras注意力层覆盖LSTM

16

我正在使用Keras 1.0.1版本,尝试在LSTM之上添加一个attention层。 我目前的代码如下,但它不起作用。

input_ = Input(shape=(input_length, input_dim))
lstm = GRU(self.HID_DIM, input_dim=input_dim, input_length = input_length, return_sequences=True)(input_)
att = TimeDistributed(Dense(1)(lstm))
att = Reshape((-1, input_length))(att)
att = Activation(activation="softmax")(att)
att = RepeatVector(self.HID_DIM)(att)
merge = Merge([att, lstm], "mul")
hid = Merge("sum")(merge)

last = Dense(self.HID_DIM, activation="relu")(hid)
网络应在输入序列上应用一个LSTM。然后,LSTM的每个隐藏状态应输入到完全连接的层中,Softmax应用于该层。 softmax会针对每个隐藏维度复制并与LSTM隐藏状态按元素相乘。 然后应平均化结果向量。
编辑:这可以编译,但我不确定它是否执行我认为它应该执行的操作。
input_ = Input(shape=(input_length, input_dim))
lstm = GRU(self.HID_DIM, input_dim=input_dim, input_length = input_length, return_sequences=True)(input_)
att = TimeDistributed(Dense(1))(lstm)
att = Flatten()(att)
att = Activation(activation="softmax")(att)
att = RepeatVector(self.HID_DIM)(att)
att = Permute((2,1))(att)
mer = merge([att, lstm], "mul")
hid = AveragePooling1D(pool_length=input_length)(mer)
hid = Flatten()(hid)

这里有一个简单的方法来添加关注:https://dev59.com/6FIG5IYBdhLWcg3wyEhG#62949137 - Marco Cerliani
1个回答

1
你分享的第一段代码是错误的。第二段代码看起来正确,除了一件事。不要使用TimeDistributed,因为权重将相同。使用一个常规的带有非线性激活函数的Dense层。

    input_ = Input(shape=(input_length, input_dim))
    lstm = GRU(self.HID_DIM, input_dim=input_dim, input_length = input_length, return_sequences=True)(input_)
    att = Dense(1, activation='tanh')(lstm_out )
    att = Flatten()(att)
    att = Activation(activation="softmax")(att)
    att = RepeatVector(self.HID_DIM)(att)
    att = Permute((2,1))(att)
    mer = merge([att, lstm], "mul")


现在你已经有了调整权重的状态。如何使用取决于您。我见过的大多数注意力版本只是在时间轴上将它们加起来,然后使用输出作为上下文。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接