首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有slim.dataset_data_provider.DatasetDataProvider抛出错误的num_epochs=1

带有slim.dataset_data_provider.DatasetDataProvider抛出错误的num_epochs=1
EN

Stack Overflow用户
提问于 2018-01-29 06:00:47
回答 1查看 1.5K关注 0票数 0

我使用的是相对新的tf.slim数据集,DatasetDataProvider模式。以下代码显示了关键片段:

代码语言:javascript
复制
with tf.Graph().as_default():    

    # get the dataset split
    dataset = util.get_split(train_or_eval,
                             args.tfrecord_folder, 
                             0, 
                             args.eval_set_size,
                             crop_size, 
                             file_pattern=file_pattern)


    features, labels = util.load_batch(dataset,
                                       batch_size=args.eval_batch_size, 
                                       num_readers=10,
                                       num_epochs=1,
                                       is_training=True)

    with tf.Session() as sess:

        sess.run(tf.global_variables_initializer())
        sess.run(tf.local_variables_initializer())

        # start the queue runner
        with slim.queues.QueueRunners(sess): 

               ...run some ops...

以下是load_batch的定义:

代码语言:javascript
复制
def load_batch(dataset, batch_size=64, is_training=False, 
               num_epochs=None, common_queue_capacity=256,
               common_queue_min=32, num_readers=None):

     shuffle = True

     # create the data provider
     data_provider = slim.dataset_data_provider.DatasetDataProvider(
                              dataset, 
                              num_readers=num_readers,
                              shuffle=shuffle, 
                              num_epochs=num_epochs, 
                              common_queue_capacity= 
                                  common_queue_capacity, 
                              common_queue_min= common_queue_min, 
                              seed=5)

     # get the tensors from the data provider
     images, labels = data_provider.get(['image_raw','label'])

     # batch up some training data
     images, labels = tf.train.batch([image_raw, label],
                                      batch_size=batch_size,
                                      num_threads=5,
                                      allow_smaller_final_batch=True,
                                      capacity=2 * batch_size)

     return images, labels

当num_epochs=None (根据源中的注释,这意味着可以无限次读取tfrecords文件)时,这很好,但是当num_epochs=1失败时,这是错误消息:

代码语言:javascript
复制
Out of range: FIFOQueue '_9_batch/fifo_queue' is closed and has insufficient elements (requested 32, current size 0)

显然,我需要能够在不重复这些例子的情况下运行eval步骤,以获得良好的准确性和混淆矩阵数。任何想法都将不胜感激..。

根据注释中的请求,我要添加堆栈跟踪。我是在中运行这项工作,所以用这种方式来展示它是最容易的。日志有一系列成对消息,如下所示:

超出范围: FIFOQueue '_6_ batch /fifo_queue‘已关闭且元素不足(请求32,当前大小为0)[Node:batch=QueueDequeueUpToV2device="/job:localhost/replica:0/task:0/cpu:0“] [节点: batch = QueueDequeueUpToV2device="/job:localhost/replica:0/task:0/cpu:0“]]

最后的堆栈跟踪是

“副本母版0退出时状态为1.终止原因: Error.Traceback (最近一次调用):.文件"/root/.local/lib/python2.7/site-packages/trainer/task.py",第509行,在main() "/root/.local/lib/python2.7/site-packages/trainer/task.py",第505行,在main run() "/root/.local/lib/python2.7/site-packages/trainer/task.py",第113行,在run "/root/.local/lib/python2.7/site-packages/trainer/util.py",(Args)文件行285中,在run_eval is_training=True中,在文件“/root/.local/lib/python2.7/site-packages/trainer/util.py”,行210中,在load_batch capacity=3 *batch_size中)文件"/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/input.py",行872中,(在批处理"/usr/local/lib/python2.7/dist-packages/tensorflow/python/training/input.py",中)文件name=name行665,_batch脱队列= queue.dequeue_up_to(batch_size,name=name)文件name=name行499,在dequeue_up_to self._queue_ref,n=n,component_types=self._dtypes中,文件"/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_data_flow_ops.py",( name=name)第1402行( _queue_dequeue_up_to_v2 timeout_ms=timeout_ms,name=name)文件"/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.py",行763,文件"/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py",( apply_op op_def=op_def)中的第2327行,在create_op original_op=self._default_original_op,op_def=op_def中)文件的第1226行,在init self._traceback = _extract_stack()中 OutOfRangeError (参见上面的回溯):FIFOQueue '_6_ batch /fifo_queue‘已关闭,并且没有足够的元素(请求32,当前大小为0) [Node:batch=QueueDequeueUpToV2device="/job:localhost/replica:0/task:0/cpu:0“],以查找更多有关作业退出的原因,请检查日志:https://console.cloud.google.com/logs/viewer

EN

回答 1

Stack Overflow用户

发布于 2018-02-13 01:51:55

在深入研究和阅读了Github之后,许多人报告说,消除这个问题需要确保在会话的顶部运行局部变量和全局变量的初始化程序。类似于使用以下方法的这一个

代码语言:javascript
复制
tf.group(tf.local_variables_initializer(), tf.global_variables_initializer{}

然而,这并没有解决许多人(包括我)的问题,我怀疑,对于那些确实有效的问题,还有其他问题导致了一个空的FIFO队列。

经过多次阅读,这似乎是一个缺陷,没有一个明显的解决办法。提出了几个工作环境。我运行了一个完整的周期火车,评估,和预测。以下是对我起作用的方法:

1) 关于训练,我设置了num_epochs=None。这种循环在数据中循环无限次,如果文档是正确的,则每个示例每个时代只显示一次。我确实进行了抽查以确认这一点,但我的数据集太大,无法保证文档是正确的。尽管如此,我的模型并没有过分适合。就准确性而言,培训、测试和验证都相当接近。

2) On eval,我正在构建一个15个模型集合,在提交未标记的数据进行验证之前,我希望将方案选择与基本事实进行比较。我在k折叠交叉验证运行中保留了一个额外的支持集,并且需要确保在延迟集中的每个示例都被预测了一次,而且只有一次。为此,I: a)设置num_epochs=1,b)删除除预测之外的所有计算,c)将eval集的大小减少到~3000个示例,d)设置shuffle_batch=False,e)设置批处理大小,以便队列有几个额外的示例。

在这些条件下,队列运行程序在完成图形并得到测试集之前没有用完示例。

3) On predict,我再次使用了与eval相同的技术,只不过我选择了与预测记录数量完全相等的批处理大小和列车步数。由于没有梯度背靠背,预测足够快完成之前,排队跑步者可以杀死我的工作。

问题解决了。陪审团操纵了。但是成功了。绝望是智慧之母或诸如此类的东西!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48495228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档