В чем разница между tensorflow dynamic_rnn и rnn?
В tf.nn
имеется несколько классов, относящихся к RNN. В примерах, которые я нахожу в сети, tf.nn.dynamic_rnn
и tf.nn.rnn
кажутся взаимозаменяемыми или, по крайней мере, я не могу понять, почему один используется вместо другого. В чем разница?
Ответы
Ответ 1
Из RNN в Tensorflow, Практическое руководство и недокументированные функции от Denny Britz, опубликованного 21 августа 2016 года.
tf.nn.rnn
создает развернутый график для фиксированной длины RNN. Что означает, что если вы вызываете tf.nn.rnn
с входами, имеющими 200 временных шагов, вы создавая статический график с 200 шагами RNN. Во-первых, создание графика медленный. Во-вторых, вы не можете пройти более длинные последовательности ( > 200), чем вы изначально указали.
tf.nn.dynamic_rnn
решает это. Он использует цикл tf.While
для динамического построить график, когда он будет выполнен. Это означает, что создание графика быстрее, и вы можете комбинировать партии переменного размера.
Ответ 2
Они почти одинаковы, но есть небольшая разница в структуре ввода и вывода. Из документации:
tf.nn.dynamic_rnn
Эта функция функционально идентична функции rnn
выше, но > выполняет полностью динамическое разворачивание входов.
В отличие от rnn
входные входы не являются списком тензоров Python, один для каждый кадр. Вместо этого входы могут быть одним тензором, где максимальный время - либо первое, либо второе измерение (см. параметр time_major
). Альтернативно, это может быть (возможно, вложенный) кортеж Тензоры, каждый из которых имеет соответствующие размеры партии и времени. соответствующий выход представляет собой либо один тензор, имеющий одинаковое число временных шагов и размера партии, или (возможно, вложенного) кортежа таких тензоров, соответствующих вложенной структуре cell.output_size
.
Подробнее см. источник.