时间上的动态展开
dynamic_rnn()函数使用while_loop()操作,在单元上运行适当的次数,如果要在反向传播期间将 GPU内 存交换到 CPU 内存,可以设置swap_memory = True,以避免内存不足错误。 方便的是,它还可以在每个时间步(形状为[None, n_steps, n_inputs])接受所有输入的单个张量,并且在每个时间步(形状[None, n_steps, n_neurons])上输出所有输出的单个张量。 没有必要堆叠,拆散或转置。 以下代码使用dynamic_rnn()函数创建与之前相同的 RNN。 这太好了!
完整代码
import numpy as npimport tensorflow as tfimport pandas as pdif __name__ == '__main__':n_steps = 2n_inputs = 3n_neurons = 5X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)init = tf.global_variables_initializer()X_batch = np.array([[[0, 1, 2], [9, 8, 7]], # instance 1[[3, 4, 5], [0, 0, 0]], # instance 2[[6, 7, 8], [6, 5, 4]], # instance 3[[9, 0, 1], [3, 2, 1]], # instance 4])with tf.Session() as sess:init.run()outputs_val = outputs.eval(feed_dict={X: X_batch})print(outputs_val)
在反向传播期间,while_loop()操作会执行相应的步骤:在正向传递期间存储每次迭代的张量值,以便在反向传递期间使用它们来计算梯度。
