我使用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_producer的num_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 ...
答案 0 :(得分:0)
当遵循使用tfrecord
的官方指示时,OutOfRangeError
通常来自队列中不适当的元素或不适当的数据构建或预处理。
feed_dict
的过程中,我想知道如何在一个函数中定义模型,该函数将数据作为Tensor输入。在这种情况下,我必须构建单独的计算图形来提供训练数据以及测试数据。 2,如果使用feed_dict
,你怎么知道一个时代的结束?似乎tf.train.shuffle_batch
将输出固定长度的批次直到结束。我很难使用epoch
(非batch
号码)来控制培训流程。