我关注RNN tutorial of Tensorflow。
我无法理解以下脚本中function ptb_producer
中的reader.py
:
with tf.control_dependencies([assertion]):
epoch_size = tf.identity(epoch_size, name="epoch_size")
i = tf.train.range_input_producer(epoch_size, shuffle=False).dequeue()
x = tf.strided_slice(data, [0, i * num_steps],[batch_size, (i + 1) * num_steps])
x.set_shape([batch_size, num_steps])
y = tf.strided_slice(data, [0, i * num_steps + 1],[batch_size, (i + 1) * num_steps + 1])
y.set_shape([batch_size, num_steps])
return x, y
任何人都可以解释tf.train.range_input_producer
正在做什么吗?
答案 0 :(得分:0)
我几周来一直试图理解相同的教程。在我看来,令人困难的是,TensorFlow调用的所有函数都不会立即执行,而是将相应的操作节点添加到图形中。
根据official documentation,范围输入生成器'在队列中生成从0
到limit - 1
的整数。因此,我看到它的方式,问题i = tf.train.range_input_producer(epoch_size, shuffle=False).dequeue()
中的代码创建了一个节点,该节点充当计数器,一旦执行就生成序列0:(epoch_size)
中的下一个数字。
这用于从输入数据中获取下一批。原始数据被分成batch_size
行,因此每次运行batch_size
批次都会被赋予培训功能。在每个批次(行)中,大小为num_steps
的滑动窗口向前移动。计数器i
允许窗口在每次通话中向前移动num_steps
。
x
和y
都具有[batch_size, num_steps]
形状,因为它们每个都包含batch_size
批num_steps
个步骤。变量x
是输入,y
是给定输入的预期输出(它是通过将窗口向左移动一个项目产生的,因此iff x = data[i:(i + num_steps] then y = data[(i + 1):(i + num_steps + 1)]
。
这对我来说是一场噩梦,但我希望这篇文章可以帮助将来的人们。