2017-06-13 76 views
0

我在Tensorflow上的輸入管道有問題>我不確定我是否正確理解隊列。Tensorflow先進先出隊列已關閉並且元素不足

我首先創建的兩個獨立slice_input_producer生成路徑圖像和標籤

paths_queue_mines=tf.train.slice_input_producer([t_pathsMine,t_pathMask,t_labels], 
               shuffle=True) 
paths_queue_bckg=tf.train.slice_input_producer((t_pathBckg,), 
               shuffle=True) 

處理我在一個圖像張量和一個標籤張量相結合的一切,我添加到新的隊列後

images_queue=tf.FIFOQueue(capacity=300, 
          dtypes=[tf.float32,tf.float32], 
          shapes=[(SHAPE,SHAPE,1),(SUBDIVISION,SUBDIVISION,5)], 
          name='images_queue') 


enqueue_op=images_queue.enqueue((img_final,label_final)) 
N_threads=20 
#create QueueRunner for filling images_queue 
qr=tf.train.QueueRunner(images_queue,[enqueue_op]*N_threads) 
tf.train.add_queue_runner(qr) 

然後我可以啓動使用images_queue.dequeueMany我的訓練,但之後的培養了一批具備規模幾步(4和160之間64)我得到以下錯誤:

FIFOQueue '_2_Preprocessing/images_queue' is closed and has insufficient elements (requested 64, current size 44) 
    [[Node: images_queue_DequeueMany = QueueDequeueManyV2[component_types=[DT_FLOAT, DT_FLOAT], timeout_ms=-1, _device="/job:localhost/replica:0/task:0/cpu:0"](Preprocessing/images_queue, images_queue_DequeueMany/n)]] 

Caused by op 'images_queue_DequeueMany', defined at: 
    File "main.py", line 194, in <module> 
    run_training() 
    File "main.py", line 114, in run_training 
    images,labels = images_queue.dequeue_many(FLAGS.batch_size) 
    File "/home/thales/anaconda3/lib/python3.5/site-packages/tensorflow/python/ops/data_flow_ops.py", line 458, in dequeue_many 
    self._queue_ref, n=n, component_types=self._dtypes, name=name) 
    File "/home/thales/anaconda3/lib/python3.5/site-packages/tensorflow/python/ops/gen_data_flow_ops.py", line 1328, in _queue_dequeue_many_v2 
    timeout_ms=timeout_ms, name=name) 
    File "/home/thales/anaconda3/lib/python3.5/site-packages/tensorflow/python/framework/op_def_library.py", line 768, in apply_op 
    op_def=op_def) 
    File "/home/thales/anaconda3/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 2336, in create_op 
    original_op=self._default_original_op, op_def=op_def) 
    File "/home/thales/anaconda3/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 1228, in __init__ 
    self._traceback = _extract_stack() 

OutOfRangeError (see above for traceback): FIFOQueue '_2_Preprocessing/images_queue' is closed and has insufficient elements (requested 64, current size 44) 
    [[Node: images_queue_DequeueMany = QueueDequeueManyV2[component_types=[DT_FLOAT, DT_FLOAT], timeout_ms=-1, _device="/job:localhost/replica:0/task:0/cpu:0"](Preprocessing/images_queue, images_queue_DequeueMany/n)]] 

我不明白爲什麼隊列被關閉。即使內部沒有足夠的圖像,程序也應該等待它再次填充,但是當我捕捉到異常並在3秒後再次嘗試時,同樣的情況發生在隊列中相同數量的圖像上。

當尋找到tensorflow文檔的sliceInputProducer

num_epochs:(可選)一個整數。如果指定的input_producer 在生成 OutOfRange錯誤之前生成input_tensor num_epochs次的每一行。如果未指定,input_producer可以循環執行 ,通過input_tensor的行無限次數。

因此,切片輸入生產者在看到所有數據後不應關閉。

這是我的預處理過重,所以隊列無法足夠快速地填充並在一段時間後關閉?

謝謝您的幫助

+0

如果您可以粘貼一些重現錯誤的自包含代碼,這將有所幫助。 – npf

+0

這種錯誤通常表示您的預處理代碼中的一個操作失敗,並且在關閉期間關閉了隊列。在OutOfRangeError之前是否還有其他例外或錯誤消息? – mrry

回答

0

問題解決了:這是預處理過程中隨機出現的錯誤。當我的images_queue試圖排隊一個新的圖像並引發此異常時,不會打印任何內容,但會關閉隊列。然後稍後當我嘗試訪問隊列時,它會提高OutOfRangeError

相關問題