Реализация внимания LSTM + с неопределенной формой временного шага - PullRequest
2 голосов
/ 18 марта 2020

Я пытаюсь реализовать составной 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)

Что я думаю, что мой код делает:

What I think this code is doing

Изображение блока внимания с этого видео.

1 Ответ

0 голосов
/ 26 марта 2020

Это невозможно сделать из-за ограничения тензорной операции. Обычно, когда вы упаковываете данные для обучения, вам необходимо упаковать их в тензор, что означает, что длина их последовательности должна быть одинаковой для всех данных.

Если вы хотите создать динамический c временной шаг, вам нужно реализовать свой код, используя метод не-векторизации, который очень неэффективен (представьте, что вам нужно делать для -l oop каждый раз, когда вы умножить матрицу вместо использования умножения матрицы).

Обычно, когда мы имеем дело с данными различной длины последовательности, данные дополняются нулями и маскируют ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...