Python OutOfRangeError:RandomShuffleQueue:使用tensorflow';s shuffle_批

Python OutOfRangeError:RandomShuffleQueue:使用tensorflow';s shuffle_批,python,tensorflow,Python,Tensorflow,我使用我的tfrecord的文件名作为tf.TFRecordReader的输入,并将其输入到tf.train.shuffle\u batch以批量生成我的自定义数据。 然后我创建一个会话、模型等和“tf.train.coordinator” 它在数据的第一次迭代中运行良好,但在第二次迭代时停止工作。 比如说,我有10000行数据,并将批量大小设置为100。经过100次训练循环后,我得到了以下错误: 超出范围错误:RandomShuffequeue “_2_shuffle_batch/random

我使用我的
tfrecord
的文件名作为
tf.TFRecordReader
的输入,并将其输入到
tf.train.shuffle\u batch
以批量生成我的自定义数据。 然后我创建一个会话、模型等和“tf.train.coordinator”

它在数据的第一次迭代中运行良好,但在第二次迭代时停止工作。

比如说,我有10000行数据,并将批量大小设置为100。经过100次训练循环后,我得到了以下错误:

超出范围错误:RandomShuffequeue “_2_shuffle_batch/random_shuffle_queue”已关闭,并且没有足够的内存 元素(请求100,当前大小0)

我将的
num\u epochs
设置为
None
,因此我认为
string\u input\u producer
会在tf.train.shuffle\u批处理数据用完时再次输入相同的文件名

我错过了什么吗

以下是我的代码片段:

# queue with a list of filenames 
filename_queue = tf.train.string_input_producer([filename], name="filename_queue", 
                                                      shuffle=True, num_epochs=None) 
reader = tf.TFRecordReader()

_, serialized_example = reader.read(filename_queue) 
features = tf.parse_single_example(serialized_example,
          features={
                'f1': ....
                'f2': ....,
          })

# batch
batch_size = 100
f1_batch, f1_batch = tf.train.shuffle_batch([f1, f2], batch_size=batch_size, num_threads=10,
                                              capacity=1000 + 3*batch_size,
                                              min_after_dequeue=1000) 

# 
# ... create a session, build model, optimizer, summary writer etc
# 

init = tf.initialize_all_variables()
sess.run(init)    

# start queue thread
coord = tf.train.Coordinator()
tf.train.start_queue_runners(sess=sess, coord=coord)

for i in range(NUM_EPOCHS): 
    # get batch data    
    x, y = sess.run([f1_batch, f2_batch])        

    # optimize
    sess.run(optimizer, feed_dict={x:x,y:y})

    # ... calc loss, write summary ...

当遵循使用
tfrecord
的官方指示时,
OutOfRangeError
通常来自队列中的元素不足或数据构造或预处理不当


顺便说一句,我有两个问题。1,我想知道如何在一个函数中定义模型,该函数将数据作为张量输入,而不是使用
feed_dict
。在这种情况下,我必须构造单独的计算图来提供训练数据和测试数据。2.如果使用
feed\u dict
,您如何知道一个时代的结束?似乎
tf.train.shuffle\u batch
将输出固定长度的批,直到结束。我很难使用
epoch
(而不是
batch
number)来控制培训过程。

当按照官方指示使用
tfrecord
时,
OutOfRangeError
通常来自队列中的元素不足或数据构造或预处理不当


顺便说一句,我有两个问题。1,我想知道如何在一个函数中定义模型,该函数将数据作为张量输入,而不是使用
feed_dict
。在这种情况下,我必须构造单独的计算图来提供训练数据和测试数据。2.如果使用
feed\u dict
,您如何知道一个时代的结束?似乎
tf.train.shuffle\u batch
将输出固定长度的批,直到结束。我很难使用
epoch
(而不是
batch
number)来控制训练过程。

使用session.run()来计算队列输出,然后将计算值传递到模型的其余部分(通常在整个过程中将它们作为张量保留)有点奇怪。如果只是在每个步骤中打印x和y而不是优化,是否会出现相同的错误?看起来在shuffle\u批处理行上还有一个“f1\u批处理,f1\u批处理”的打字错误。谢谢你,艾伦。是的,如果我只打印
x
y
,我会得到相同的错误。我想我需要
session.run()
来获取python值,这样我就可以将它们输入
feed\u dict
。我错过什么了吗?是的,那是一个打字错误。谢谢将队列输出馈送到模型中的惯用方法是在函数中定义模型,该函数将数据作为张量输入。这就是tf.learn所做的,使用。至于错误:我无法重现它。你能试着把它变成一个完整的(即可执行的)并且希望是最小的例子吗?我的
tfrecord
文件中似乎有一些问题。在我重建文件后,一切都开始正常工作(神奇地)。。。至于提要队列,您是对的。我可以用张量输入定义模型。我还没想过。再次感谢你的帮助。非常感谢!!结果是。。。如果
tfrecord
文件中的总样本数据数可被批大小整除,则该方法效果良好。我猜这与
tf.train.shuffle\u batch
allow\u minger\u final\u batch
标志有关。我认为如果我将标志设置为False,那么函数只会忽略剩余的“较小的最终批”,并跳到下一个迭代。如果不是这样,这是否意味着我必须始终关注样本数/批大小?使用session.run()计算队列输出,然后将计算值传递到模型的其余部分(通常在整个过程中将它们作为张量保留)有点奇怪。如果只是在每个步骤中打印x和y而不是优化,是否会出现相同的错误?看起来在shuffle\u批处理行上还有一个“f1\u批处理,f1\u批处理”的打字错误。谢谢你,艾伦。是的,如果我只打印
x
y
,我会得到相同的错误。我想我需要
session.run()
来获取python值,这样我就可以将它们输入
feed\u dict
。我错过什么了吗?是的,那是一个打字错误。谢谢将队列输出馈送到模型中的惯用方法是在函数中定义模型,该函数将数据作为张量输入。这就是tf.learn所做的,使用。至于错误:我无法重现它。你能试着把它变成一个完整的(即可执行的)并且希望是最小的例子吗?我的
tfrecord
文件中似乎有一些问题。在我重建文件后,一切都开始正常工作(神奇地)。。。至于提要队列,您是对的。我可以用张量输入定义模型。我还没想过。再次感谢你的帮助。非常感谢!!结果是。。。如果
tfrecord
文件中的总样本数据数可被批大小整除,则该方法效果良好。我猜这与
tf.train.shuffle\u batch
allow\u minger\u final\u batch
标志有关。我认为如果我将标志设置为False,那么函数只会忽略剩余的“较小的最终批”,并跳到下一个迭代。如果不是这样,是不是意味着我总是