tensorflow dynamic_rnn和rnn有什么区别?

32

tf.nn中有几个与RNN相关的类。在我在网上找到的例子中,tf.nn.dynamic_rnntf.nn.rnn似乎可以互换使用,或者至少我不能弄清楚为什么要用其中一个代替另一个。它们之间有什么区别?


1
另请参阅此 Stack Overflow 帖子 https://dev59.com/81gQ5IYBdhLWcg3wnFLJ,作者询问在较新版 TensorFlow 中 tf.nn.rnn 的等效函数是什么,似乎是 tf.nn.static_rnn - nbro
2个回答

49

来自Denny Britz的《TensorFlow中的RNN:实用指南和未记录功能》,发表于2016年8月21日。

tf.nn.rnn创建一个长度固定的展开图。这意味着,如果您使用具有200个时间步长的输入调用tf.nn.rnn,则会创建一个具有200个RNN步骤的静态图。首先,图形创建慢。其次,您无法传入比最初指定的时间步长更长的序列(> 200)。

tf.nn.dynamic_rnn解决了这个问题。它使用tf.While循环在执行时动态构建图形。这意味着图形创建更快,您可以提供可变大小的批次。


14
如果动态RNN提供了所有优势并且几乎没有缺点,为什么还会使用静态RNN? - xji
你是不是想说“提供不同的序列长度”?据我所知,任何图形都可以轻松地提供不同的批次,只需声明适当的占位符即可。 - user1700890

2
它们几乎相同,但输入和输出的结构略有不同。根据文档:
tf.nn.dynamic_rnn 此函数在功能上与上面的rnn函数完全相同,但执行完全动态展开输入。 与rnn不同,输入inputs不是Python Tensor列表,每个Tensor表示一个frame。相反,inputs可以是单个Tensor,其中最大时间可能是第一或第二维(请参见参数time_major)。或者,它可以是(可能嵌套的)Tensor元组,每个元组都具有匹配的批处理和时间维度。相应的输出是具有相同时间步长和批处理大小的单个Tensor,或者是(可能嵌套的)这些Tensor元组,与cell.output_size的嵌套结构匹配。
有关更多详细信息,请查看source

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接