Keras l'attention de la couche au LSTM

Je suis en utilisant keras 1.0.1 j'essaye d'ajouter une attention couche sur le dessus d'un LSTM. C'est ce que j'ai à ce jour, mais il ne fonctionne pas.

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)

Le réseau doit appliquer un LSTM au cours de la séquence d'entrée. Ensuite, chaque état caché de la LSTM doit être entrée dans un entièrement connecté couche, au cours de laquelle un Softmax est appliquée. Le softmax est reproduite pour chaque dimension cachée et multiplié par le LSTM états cachés elementwise. Ensuite, le vecteur résultant devrait être en moyenne.

MODIFIER: Cette compile, mais je ne suis pas sûr si c'est ce que je pense qu'il devrait faire.

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)
Salut @siamii il y avait du succès avec le réseau d'attention? Actuellement j'essaie la même chose..
Jetez un oeil à cette mise en œuvre de l'Attention sur le haut d'une LSTM: github.com/philipperemy/keras-attention-mechanism Il devrait fonctionner sur votre exemple.

OriginalL'auteur siamii | 2016-04-23