Я пытаюсь реализовать составной LSTM с вниманием с различными временными шагами. Я в основном основывался на этом , этом и этом . Эти реализации, однако, предполагают фиксированные временные шаги. Модель работает, но я не уверен, что это делает то, что я думаю, что делает. Кроме того, я не уверен, как извлечь значение уровня временного шага из этой модели.
# stacked LSTM
for i, n_hidden in enumerate(hidden_units):
x = LSTM(n_hidden, name='lstm_%i' % (i + 1), **lstm_kwargs)(x)
# flatten RNN output over time
context = TimeDistributed(Dense(n_hidden, activation='tanh'))(x)
context = Lambda(lambda x: K.batch_flatten(x))(context)
context = Dense(1, activation='tanh')
# turn context attention into probability distribution using softmax (enforce that attentions to sum up to 1)
context = Activation('softmax', name='softmax')(context)
context = RepeatVector(n_hidden)(context)
context = Permute([2,1])(context)
# multiply LSTM output with ts-wise attention
attention = Multiply()([x, context])
# make output time distributed
output = TimeDistributed(Dense(output_shape, activation=output_activation), name='output')(attention)
# initialize model wrapper
model = Model(inputs=x_input, outputs=output)
Что я думаю, что мой код делает:
Изображение блока внимания с этого видео.