【问题标题】:Why evaluate self._initial_state when training RNN in Tensorflow为什么在 Tensorflow 中训练 RNN 时评估 self._initial_state
【发布时间】:2023-04-06 01:35:01
【问题描述】:

在 RNN 教程中ptd_word_lm.py。在使用 run_epoch 训练 RNN 时,为什么需要评估 self._initial_state?

def run_epoch(session, m, data, eval_op, verbose=False):
  """Runs the model on the given data."""
  epoch_size = ((len(data) // m.batch_size) - 1) // m.num_steps
  start_time = time.time()
  costs = 0.0
  iters = 0
  state = m.initial_state.eval()
  for step, (x, y) in enumerate(reader.ptb_iterator(data, m.batch_size,
                                                    m.num_steps)):
    cost, state, _ = session.run([m.cost, m.final_state, eval_op],
                                 {m.input_data: x,
                                  m.targets: y,
                                  m.initial_state: state})
    costs += cost
    iters += m.num_steps

    if verbose and step % (epoch_size // 10) == 10:
      print("%.3f perplexity: %.3f speed: %.0f wps" %
            (step * 1.0 / epoch_size, np.exp(costs / iters),
             iters * m.batch_size / (time.time() - start_time)))

  return np.exp(costs / iters)

初始状态定义如下,在训练过程中永远不会改变。

self._initial_state = cell.zero_state(batch_size, tf.float32)

【问题讨论】:

    标签: python tensorflow lstm recurrent-neural-network


    【解决方案1】:

    在 PTB 示例中,句子被连接并分成批次(大小为 batch_size x num_steps)。在每批之后,RNN 的最后一个状态作为下一批的初始状态传递。这有效地允许您训练 RNN,就好像它是整个 PTB 语料库上的一条非常长的链(这解释了为什么要评估 model.final_state 以及为什么将状态传递到 feed_dict 中的 m.initial_state)。因此,您会看到 initial_state 实际确实在每一步都发生了变化。

    在一个纪元的最开始,我们没有先前的状态可以作为 initial_state 传递,因此使用全零,由 state = m.initial_state.eval() 表示。如果您评估了另一个名为 m.zero_state 的属性以获取此初始状态,则可能不会那么混乱。例如,您也可以使用适当大小的 numpy 零数组,这也可以正常工作。 eval 只是获得适当大小的张量或零点的便捷方式。

    希望这是有道理的!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 2015-12-12
      • 2019-04-05
      • 1970-01-01
      相关资源
      最近更新 更多