tf.nn
中有几个与RNN相关的类。在我在网络上找到的示例中,tf.nn.dynamic_rnn
和tf.nn.rnn
似乎可以互换使用,或者至少我似乎无法弄清楚为什么用一个代替另一个。有什么区别?
答案 0 :(得分:48)
来自RNNs in Tensorflow, a Practical Guide and Undocumented Features的Denny Britz,发表于2016年8月21日。
tf.nn.rnn
为固定的RNN长度创建展开的图表。那 意味着,如果您使用输入具有200个时间步长来呼叫tf.nn.rnn
创建一个包含200个RNN步的静态图。首先,图形创建是 慢。其次,您无法传递比(。> 200)更长的序列(> 200) 你最初指定的。
tf.nn.dynamic_rnn
解决了这个问题。它动态地使用tf.While
循环 在执行时构造图形。这意味着图形创建是 更快,您可以提供可变大小的批次。
答案 1 :(得分:2)
它们几乎相同,但输入和输出结构略有不同。来自文档:
tf.nn.dynamic_rnn
此函数在功能上与上面的函数
rnn
相同,但是>执行完全动态展开输入。与
rnn
不同,输入输入不是Tensors的Python列表,一个用于 每一帧。相反,输入可以是单个Tensor,其中最大值 时间是第一维或第二维(参见参数time_major
)。或者,它可能是(可能是嵌套的)元组 张量,每个都具有匹配的批次和时间维度。该 相应的输出是具有相同数字的单个Tensor 时间步长和批量大小,或者这样的(可能是嵌套的)元组 张量,匹配cell.output_size
的嵌套结构。
有关详情,请浏览source。