Machine learning Tensorflow LSTM PTB示例-了解向前和向后传球

Machine learning Tensorflow LSTM PTB示例-了解向前和向后传球,machine-learning,neural-network,tensorflow,recurrent-neural-network,lstm,Machine Learning,Neural Network,Tensorflow,Recurrent Neural Network,Lstm,现在,我正在学习LSTM上的tensorflow示例,其中他们使用PTB数据集创建能够预测下一个单词的LSTM网络。我花了很多时间试图理解代码,并且对大部分代码都有很好的理解,但是有一个函数我没有完全掌握: def run_epoch(session, model, eval_op=None, verbose=False): """Runs the model on the given data.""" costs = 0.0 iters = 0 state = sess

现在,我正在学习LSTM上的tensorflow示例,其中他们使用PTB数据集创建能够预测下一个单词的LSTM网络。我花了很多时间试图理解代码,并且对大部分代码都有很好的理解,但是有一个函数我没有完全掌握:

    def run_epoch(session, model, eval_op=None, verbose=False):
  """Runs the model on the given data."""
  costs = 0.0
  iters = 0
  state = session.run(model.initial_state)

  fetches = {
      "cost": model.cost,
      "final_state": model.final_state,
  }
  if eval_op is not None:
    fetches["eval_op"] = eval_op

  for step in range(model.input.epoch_size):
    feed_dict = {}
    for i, (c, h) in enumerate(model.initial_state):
      feed_dict[c] = state[i].c
      feed_dict[h] = state[i].h

    vals = session.run(fetches, feed_dict)
    cost = vals["cost"]
    state = vals["final_state"]

    costs += cost
    iters += model.input.num_steps    

  return np.exp(costs / iters)

我的困惑是:每次通过外部循环,我相信我们已经处理了成批的单词数量,进行了正向传播和反向传播。但是,例如,在下一次迭代中,如果num_steps=35,我们如何知道从每个批次的第36个单词开始?我怀疑每次迭代时类模型的属性都会发生一些变化,但我无法弄清楚这一点。感谢您的帮助。

看看
reader
,这是一个负责生成数据(和实际切片)的类,我之前已经看过了,以便更熟悉数据的结构,但是我仍然看不到是什么通过
run\u epoch
函数的外部for循环改变了每次迭代,我们知道当我们在
fetches
字典中运行操作时,会处理新数据。没有什么真正的改变,读取器本身控制它在队列中的位置(看看
I
变量)。每次读取内容时,您都会移动内部计数器-因此您不需要更改“外部”代码中的任何内容,内部计数器是增量的,就像您对文件描述符调用“读取”时文件描述符“自行移动”。谢谢您的澄清。那么,在
ptb_producer
函数中,我正在创建队列中的
i
数据块?在主程序中,当我处理完一个数据块后,我会通过向上移动队列自动转到下一个?