RNN 的图形使用模式

Graph usage pattern for RNNs

我对默认图表中 tensors/ops/variables 的生命周期感到困惑。

在 RNN 中,由于输入数据的长度可变,图结构将在每次迭代中发生变化。因此,是否应该在每次训练迭代中使用单独的图 created/destroyed 以适应图的不断变化的结构,还是有办法坚持使用默认图?

另外,如果构建新的图,它们如何共享变量?

具体对于 RNN,有两个选项:tf.nn.rnntf.nn.dynamic_rnn。没有人临时创建或销毁图形。

第一个函数创建 T 个子图,其中 T 是您提供的 python 输入列表的长度(即,输入是一个 len T python 形状列表 [batch, depth] 张量)。 tf.nn.rnn 总是需要固定数量的时间步长。请注意,您可以通过传递 sequence_length 参数来控制给定步骤的 哪些 子图 运行;该函数然后使用条件评估 (tf.cond) 来确定哪些操作获得 运行.

相比之下,dynamic_rnn 使用特殊的 TensorFlow while 循环和其他技巧,在图形结构中引入有限类型的循环。在这种情况下,"time step" 正好有一个子图,它会一遍又一遍地得到 运行,直到您的输入被处理。在这种情况下,您的输入是一个 3D 张量,尺寸为 [batch, time, depth](如果您设置 time_major=True,它可以是 [time, batch, depth]);前两个维度可能因步骤而异。