在张量流中,tf.nn.static_rnn
和tf.nn.dynamic_rnn
有什么区别,以及何时使用它们?
两者都采用sequence_length
参数,该参数使计算适应输入的实际长度;并不是static_rnn
限于固定大小的输入,对吧?
dynamic_rnn
具有以下额外参数:
parallel_iterations
swap_memory
time_major
但是我想这些只是细微的差别。
那么tf.nn.static_rnn
和tf.nn.dynamic_rnn
之间的主要区别是什么,我们什么时候应该在另一个之上使用呢?
答案 0 :(得分:5)
这仍然是一个有用的资源(尽管几年前已经写过): http://www.wildml.com/2016/08/rnns-in-tensorflow-a-practical-guide-and-undocumented-features/
Denny Britz在其中对静态/动态问题有以下评论:
静态
在内部,
tf.nn.rnn
为固定RNN长度创建展开图。这意味着,如果使用具有200个时间步长的输入调用tf.nn.rnn
,则将创建具有200个RNN步骤的静态图形。首先,图形创建很慢。其次,您无法传递比原来指定的更长的顺序(> 200)。
动态
tf.nn.dynamic_rnn
解决了这个问题。当执行图形时,它使用tf.While
循环来动态构造图形。这意味着图形创建速度更快,并且可以喂入可变大小的批处理。
一般而言,他得出结论,使用tf.nn.static_rnn
并没有真正的好处,而且在大多数情况下,您需要使用tf.nn.dynamic_rnn
对于我所拥有的价值,我自己也有同样的经历。