Machine learning Tensorflow LSTM PTB示例-了解向前和向后传球
现在,我正在学习LSTM上的tensorflow示例,其中他们使用PTB数据集创建能够预测下一个单词的LSTM网络。我花了很多时间试图理解代码,并且对大部分代码都有很好的理解,但是有一个函数我没有完全掌握: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
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
数据块?在主程序中,当我处理完一个数据块后,我会通过向上移动队列自动转到下一个?