Любая идея о том, как реализовать подключенную архитектуру LSTM RNN в тензорном потоке? - PullRequest
0 голосов
/ 10 сентября 2018

Я хотел использовать этот пример и расширить его для реализации архитектуры на следующем рисунке. Код использует BasicLSTMCell и tf.contrib.rnn.BasicLSTMCell следующим образом:

    lstm_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden)
    outputs, states = tf.contrib.rnn.static_rnn(lstm_cell, x, dtype=tf.float32,sequence_length=seqlen)

Я напечатал «состояния» (и выходные данные), и я ожидал, что «состояния» будут иметь форму [количество входных последовательностей, x], где x - длины каждой входной последовательности. НО, когда я печатаю «состояния» (или «выходы»), они оба имеют форму [количество входных последовательностей, n_hidden ], где n_hidden - количество объектов скрытого слоя.

Прежде всего, я печатаю скрытые состояния только для одного временного шага (возможно, последнего временного шага), а не развернутого RNN ?? Как я могу распечатать все скрытые состояния после того, как RNN обрабатывает каждый шаг входной последовательности (чтобы убедиться, что я реализую следующую архитектуру)?

Во-вторых, как бы вы реализовали следующую архитектуру в tenorflow? Предположим, что каждый x-i является 12-битным двоичным вектором, и каждая входная последовательность включает в себя не более 80 векторов. Каждая входная последовательность связана с выходной последовательностью, и цель состоит в том, чтобы предсказать эти выходные последовательности, просматривая их соответствующие входные последовательности.

Figure 1

1 Ответ

0 голосов
/ 10 сентября 2018

Это подозрительно.

Предполагается, что возвращением из static_rnn будут все выходные данные и конечное состояние ( link ).

Итак, если посмотреть на выходные данные, это должен быть список len seqlen с каждой записью партии X n_hidden.

Используйте tf.nn.static_state_saving_rnn, чтобы сохранить все промежуточные состояния, а затем распечатайте их, как любой другой тензор в вашей модели.

По вопросу архитектуры.

Если вы должны возвращать выходные данные после каждой записи, тогда возьмите выходные данные и примените потерю, чтобы они выглядели как ваши ярлыки.

Если предполагается, что вы посмотрите на всю последовательность, а затем предложите выходные данные, то вам нужны две системы rnn. У вас должна быть кодировка rnn, как у вас уже есть. Мы игнорируем выводы для этой части. Затем вы берете конечное состояние и передаете его в расшифровочный код. Этот не имеет никакого ввода. Мы берем выходные данные декодирования rnn и применяем потери, чтобы они выглядели как метки.

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

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