Tensorflow 中的 LSTM 反向传播
LSTM Backpropagation in Tensorflow
来自截断反向传播领域的官方 PTB google 教程,有一个使用 BasicLSTMCell 的实现,它通过创建一个 for 循环展开图 num_steps 个步骤。
# Placeholder for the inputs in a given iteration.
words = tf.placeholder(tf.int32, [batch_size, num_steps])
lstm = rnn_cell.BasicLSTMCell(lstm_size)
# Initial state of the LSTM memory.
initial_state = state = tf.zeros([batch_size, lstm.state_size])
for i in range(num_steps):
# The value of state is updated after processing each batch of words.
output, state = lstm(words[:, i], state)
# The rest of the code.
# ...
final_state = state
我已经使用 BasicLSTMCell 实现了一个预测时间序列的实现,但我没有在图中使用任何循环,而是在程序执行循环中更新了 lstmCells 的状态。这是代码:
input_layer = tf.placeholder(tf.float32, [input_width, input_dim * 1])
lstm_cell1 = tf.nn.rnn_cell.BasicLSTMCell(input_dim * input_width)
lstm_state1 = tf.Variable(tf.zeros([input_width,lstm_cell1.state_size]))
lstm_output1, lstm_state_output1 = lstm_cell1(input_layer, lstm_state1, scope='LSTM1')
lstm_update_op1 = lstm_state1.assign(lstm_state_output1)
for i in range(39000):
input_v, output_v = get_new_input_output(i, A)
_, _, network_output = sess.run([lstm_update_op1, train_step, final_output],
feed_dict={input_layer: input_v, correct_output: output_v})
第二个实现如何通过时间实现反向传播,这是否是在 tensorflow 中正确使用 lstmCell。我个人更喜欢第二种实现,因为我发现它更清晰并且还能够支持数据流。但是 google 提出第一个实现这一事实让我怀疑我做错了什么。
为了在训练期间通过时间进行反向传播,该图需要在正向传递期间存储所有张量的值,以便它可以在反向传递期间使用它们来计算梯度。在您的代码中,正向传递应该没有问题(不过我还没有测试过),但是反向传递无法工作,因为该图无法在正向传递期间保留张量值(因为 assign()
操作)。
我建议您看看 Danijar Hafner 的 this great post。它解释了如何使用 dynamic_rnn()
函数来执行您想要的操作。
来自截断反向传播领域的官方 PTB google 教程,有一个使用 BasicLSTMCell 的实现,它通过创建一个 for 循环展开图 num_steps 个步骤。
# Placeholder for the inputs in a given iteration.
words = tf.placeholder(tf.int32, [batch_size, num_steps])
lstm = rnn_cell.BasicLSTMCell(lstm_size)
# Initial state of the LSTM memory.
initial_state = state = tf.zeros([batch_size, lstm.state_size])
for i in range(num_steps):
# The value of state is updated after processing each batch of words.
output, state = lstm(words[:, i], state)
# The rest of the code.
# ...
final_state = state
我已经使用 BasicLSTMCell 实现了一个预测时间序列的实现,但我没有在图中使用任何循环,而是在程序执行循环中更新了 lstmCells 的状态。这是代码:
input_layer = tf.placeholder(tf.float32, [input_width, input_dim * 1])
lstm_cell1 = tf.nn.rnn_cell.BasicLSTMCell(input_dim * input_width)
lstm_state1 = tf.Variable(tf.zeros([input_width,lstm_cell1.state_size]))
lstm_output1, lstm_state_output1 = lstm_cell1(input_layer, lstm_state1, scope='LSTM1')
lstm_update_op1 = lstm_state1.assign(lstm_state_output1)
for i in range(39000):
input_v, output_v = get_new_input_output(i, A)
_, _, network_output = sess.run([lstm_update_op1, train_step, final_output],
feed_dict={input_layer: input_v, correct_output: output_v})
第二个实现如何通过时间实现反向传播,这是否是在 tensorflow 中正确使用 lstmCell。我个人更喜欢第二种实现,因为我发现它更清晰并且还能够支持数据流。但是 google 提出第一个实现这一事实让我怀疑我做错了什么。
为了在训练期间通过时间进行反向传播,该图需要在正向传递期间存储所有张量的值,以便它可以在反向传递期间使用它们来计算梯度。在您的代码中,正向传递应该没有问题(不过我还没有测试过),但是反向传递无法工作,因为该图无法在正向传递期间保留张量值(因为 assign()
操作)。
我建议您看看 Danijar Hafner 的 this great post。它解释了如何使用 dynamic_rnn()
函数来执行您想要的操作。