我正在使用keras 1.0.1,我正在尝试在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 = 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)
您共享的第一段代码不正确。第二段代码看起来是正确的,除了一件事。不要使用时间分布,因为权重将是相同的。使用具有非线性激活的常规密集图层。
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")
现在您具有权重调整状态。如何使用它取决于您。我见过的大多数版本的注意力,只需在时间轴上将它们相加,然后使用输出作为上下文。