【问题标题】:Back Propagation in time for tf.nn.dynamic_rnn for sequential input (from batch)用于顺序输入的 tf.nn.dynamic_rnn 及时反向传播(来自批处理)
【发布时间】:2018-03-14 08:52:00
【问题描述】:

我有这样的代码:

lstm_cell = tf.contrib.rnn.BasicLSTMCell(256, state_is_tuple = True)
c_in = tf.placeholder(tf.float32, [1, lstm_cell.state_size.c], "c_in")
h_in = tf.placeholder(tf.float32, [1, lstm_cell.state_size.h], "h_in")
rnn_state_in = (c_in, h_in)
rnn_in = tf.expand_dims(previous_layer, [0])
sequence_length = #size of my batch
rnn_state_in = tf.contrib.rnn.LSTMStateTuple(c_in, h_in)
lstm_outputs, lstm_state = tf.nn.dynamic_rnn(lstm_cell,
                                                    rnn_in,
                                                    initial_state = rnn_state_in,
                                                    sequence_length = sequence_length,
                                                    time_major = False)
lstm_c, lstm_h = lstm_state
rnn_out = tf.reshape(lstm_outputs, [-1, 256])

在这里,我使用 dynamic_rnn 来模拟批处理的时间步长。 每次前向传递时,我都可以获得lstm_c, lstm_h,我可以将其存储在外面的任何地方。

所以,假设我已经对我的网络中的序列中的 N 个项目进行了前向传递,并从 dynamic_rnn 提供了最终的单元状态和隐藏状态。现在,要执行反向传播,我对 LSTM 的输入应该是什么?

默认情况下,是否在 dynamic_rnn 中跨时间步发生反向传播?

(比如说,时间步数 = batch_size=N)

所以我提供如下输入是否足够:

sess.run(_train_op, feed_dict = {_state: np.vstack(batch_states),
                                            ...
                                            c_in: prev_rnn_state[0],
                                            h_in: prev_rnn_state[1]
})

(其中prev_rnn_statecell state, hidden state 的元组,这是我从上一批前向传播的dynamic_rnn 中得到的。)

或者我是否已经跨时间序列显式展开 LSTM 层并通过提供单元状态向量和隐藏在先前时间序列中收集的向量来训练它?

【问题讨论】:

    标签: tensorflow deep-learning lstm recurrent-neural-network rnn


    【解决方案1】:

    是的,反向传播在 dynamic_rnn 中跨时间步发生。

    但是,我认为你研究了dynamic_rnninputs 参数。它的形状应该是[batch_size, max_time, ...]。当您使用类似形状的输入调用 dynamic_rnn 时,它会使用您提供的初始状态 rnn_state_in 调用您的 lstm_cell max_time 次。

    请记住,dynamic_rnn 在每个时间步都会自动从上一个时间步获取 c 和 h 状态。所以你不必每次都在 sess.run(..) 中喂它们。您只需要提供输入。

    当您使用 lstm 的最终状态(或所有状态)计算损失并使用 SGD 或 adam 等优化器时,将计算所有时间步的反向传播。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      相关资源
      最近更新 更多