时间上的动态展开

dynamic_rnn()函数使用while_loop()操作,在单元上运行适当的次数,如果要在反向传播期间将 GPU内 存交换到 CPU 内存,可以设置swap_memory = True,以避免内存不足错误。 方便的是,它还可以在每个时间步(形状为[None, n_steps, n_inputs])接受所有输入的单个张量,并且在每个时间步(形状[None, n_steps, n_neurons])上输出所有输出的单个张量。 没有必要堆叠,拆散或转置。 以下代码使用dynamic_rnn()函数创建与之前相同的 RNN。 这太好了!

完整代码

  1. import numpy as np
  2. import tensorflow as tf
  3. import pandas as pd
  4. if __name__ == '__main__':
  5. n_steps = 2
  6. n_inputs = 3
  7. n_neurons = 5
  8. X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
  9. basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)
  10. outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)
  11. init = tf.global_variables_initializer()
  12. X_batch = np.array([
  13. [[0, 1, 2], [9, 8, 7]], # instance 1
  14. [[3, 4, 5], [0, 0, 0]], # instance 2
  15. [[6, 7, 8], [6, 5, 4]], # instance 3
  16. [[9, 0, 1], [3, 2, 1]], # instance 4
  17. ])
  18. with tf.Session() as sess:
  19. init.run()
  20. outputs_val = outputs.eval(feed_dict={X: X_batch})
  21. print(outputs_val)

在反向传播期间,while_loop()操作会执行相应的步骤:在正向传递期间存储每次迭代的张量值,以便在反向传递期间使用它们来计算梯度。