Keras1.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を適用する必要があります。ソフトマックスは、非表示の次元ごとに複製され、要素ごとにLSTMの非表示状態が乗算されます。次に、結果のベクトルを平均する必要があります。
[〜#〜] edit [〜#〜]:これはコンパイルされますが、私が思うように動作するかどうかはわかりません。
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)