Я в настоящее время использую этот код, который я получаю от одного обсуждения на github. Здесь код механизма внимания:
_input = Input(shape=[max_length], dtype='int32')
# get the embedding layer
embedded = Embedding(
input_dim=vocab_size,
output_dim=embedding_size,
input_length=max_length,
trainable=False,
mask_zero=False
)(_input)
activations = LSTM(units, return_sequences=True)(embedded)
# compute importance for each step
attention = Dense(1, activation='tanh')(activations)
attention = Flatten()(attention)
attention = Activation('softmax')(attention)
attention = RepeatVector(units)(attention)
attention = Permute([2, 1])(attention)
sent_representation = merge([activations, attention], mode='mul')
sent_representation = Lambda(lambda xin: K.sum(xin, axis=-2), output_shape=(units,))(sent_representation)
probabilities = Dense(3, activation='softmax')(sent_representation)
Это правильный способ сделать это? я как бы ожидал существования распределенного по времени слоя, так как механизм внимания распределяется на каждом временном шаге RNN. Мне нужно, чтобы кто-то подтвердил, что эта реализация (код) является правильной реализацией механизма внимания. Спасибо.