OutOfRangeError:RandomShuffleQueue:使用tensorflow的shuffle_batch

时间:2016-10-31 22:21:58

标签: python tensorflow

我使用string_input_producer作为tfrecord的文件名作为tf.TFRecordReader的输入,并将其输入tf.train.shuffle_batch以制作批量的自定义数据。 然后我创建一个会话,模型等'tf.train.coordinater。'

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

说,我有10,000行数据,并将批量大小设置为100.经过100次训练循环后,我收到此错误:

  

OutOfRangeError:RandomShuffleQueue   '_2_shuffle_batch / random_shuffle_queue'已关闭且不足   元素(请求100,当前大小0)

我将string_input_producernum_epochs设置为None,因此我认为一旦tf.train.shuffle_batch用尽数据,string_input_producer将再次输入相同的文件名。

我错过了什么吗?

以下是我的代码片段:

# 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 ...

1 个答案:

答案 0 :(得分:0)

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

顺便说一句,我有两个问题。 1,在使用feed_dict的过程中,我想知道如何在一个函数中定义模型,该函数将数据作为Tensor输入。在这种情况下,我必须构建单独的计算图形来提供训练数据以及测试数据。 2,如果使用feed_dict,你怎么知道一个时代的结束?似乎tf.train.shuffle_batch将输出固定长度的批次直到结束。我很难使用epoch(非batch号码)来控制培训流程。