Есть идеи, как реализовать прикрепленную архитектуру lstm rnn в тензорном потоке?

Я хотел использовать пример это и расширить его, чтобы реализовать архитектуру, показанную на следующем рисунке. Код использует 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 обрабатывает каждый временной шаг входной последовательности (чтобы убедиться, что я реализую следующую архитектуру)?

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

Figure 1

0
0
83
1

Ответы 1

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

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

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

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

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

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

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

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

Спасибо за ваш ответ! tf.nn.static_state_saving_rnn имеет аргументы state_saver. Я попытался передать объект tf.train.Saver, но получаю сообщение об ошибке: «У объекта 'Saver' нет атрибута 'state'». Любой пример использования static_state_saving_rnn? Спасибо!

khemedi 10.09.2018 23:42

@Sajj в соответствии с документами, которые вам нужно передать объект, который имеет методы save_state и state. Создайте объект, который помещает параметр в список на save_state и возвращает последнюю запись при вызове state. Затем вы можете использовать список со всеми состояниями для того, что хотите.

Sorin 11.09.2018 13:43

Другие вопросы по теме