Keras关注层超过LSTM

sia*_*mii 7 python lstm keras

我正在使用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)
Run Code Online (Sandbox Code Playgroud)

网络应在输入序列上应用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)
Run Code Online (Sandbox Code Playgroud)

All*_*hvk 1

您共享的第一段代码不正确。除了一件事之外,第二段代码看起来是正确的。不要使用 TimeDistributed,因为权重是相同的。使用具有非线性激活的常规密集层。


    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")

Run Code Online (Sandbox Code Playgroud)

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