2016-11-04 5 views
-1

テンソルフローを使用してモデルを微調整し、スレッドを使用して入力キューをエンキューします。コードはいくつかの1000回の反復で正常に動作しますが、反復回数が少なくても後続のエラーが発生し続けます。しかし、コードは通常、いくつかの繰り返しの後にこれらのエラーのカップルで終了し、手動で再起動する必要があります。エラーを理解するために私を助けてください。データをフェッチする際のテンソルフローのエンキューとスレッドエラー

Exception in thread Thread-29: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner 
    self.run() 
    File "/usr/lib/python2.7/threading.py", line 763, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "data_feeder.py", line 212, in enqueue_op_online_val 
    model_vars['labels_val']: labels_minibatch}) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 717, in run 
    run_metadata_ptr) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 915, in _run 
    feed_dict_string, options, run_metadata) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 965, in _do_run 
    target_list, options, run_metadata) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 985, in _do_call 
    raise type(e)(node_def, op, message) 
NotFoundError: PruneForTargets: Some target nodes not found: fifo_queue_enqueue/fifo_queue_enqueue_4/fifo_queue_enqueue_10/fifo_queue_enqueue_10/fifo_queue_enqueue_8/fifo_queue_enqueue_2/fifo_queue_enqueue_4/fifo_queue_enqueue/fifo_queue_enqueue_3/fifo_queue_enqueue_3/fifo_queue_enqueue/fifo_queue_enqueue_1/fifo_queue_enqueue_5/fifo_queue_enqueue/fifo_queue_enqueue_2/fifo_queue_enqueue/fifo_queue_enqueue_4/fifo_queue_enqueue_6/fifo_queue_enqueue_20/fifo_queue_enqueue_29/fifo_queue_enqueue/fifo_queue_enqueue_7/fifo_queue_enqueue_8/fifo_queue_enqueue_9/fifo_queue_enqueue_7/fifo_queue_enqueue/fifo_queue_enqueue_9/fifo_queue_enqueue_8/fifo_queue_enqueue_11/fifo_queue_enqueue_5/fifo_queue_enqueue_7/fifo_queue_enqueue_8/fifo_queue_enqueue_12/fifo_queue_enqueue_3/fifo_queue_enqueue_2/fifo_queue_enqueue_5/fifo_queue_enqueue_4/fifo_queue_enqueue_7/fifo_queue_enqueue_3/fifo_queue_enqueue/fifo_queue_enqueue_9/fifo_queue_enqueue_1/fifo_queue_enqueue_25/fifo_queue_enqueue_23/fifo_queue_enqueue_30/fifo_queue_enqueue_5/fifo_queue_enqueue_3/fifo_queue_enqueue_7/fifo_queue_enqueue_3/fifo_queue_enqueue/fifo_queue_enqueue_2/fifo_queue_enqueue_8/fifo_queue_enqueue_11/fifo_queue_enqueue_11/fifo_queue_enqueue/fifo_queue_enqueue_4 

はここでここでエンキューOP

def enqueue_op(self, sess, model_vars, coord): 
     queue = model_vars['queue_train'] 
     random.shuffle(self.keys) 
     img_minibatch = np.zeros((self.batch_size, 224, 224, 3)) 
     #t = time.time() 

     for indx in xrange(self.num_batches): 
      labels_minibatch = [] 
      # Load all files in this batch 
      for i,k in\ 
      enumerate(self.keys[indx*self.batch_size:(indx+1)*self.batch_size]): 
       img = misc.imread(self.img_path + self.data[k]['filename']) 
       img_minibatch[i, :, :, :] = img_proc(img) 
       labels_minibatch.append(self.data[k]['labels']) 

      labels_minibatch =\ 
      self.mlb.fit_transform(labels_minibatch).astype(float) 
      sess.run([queue.enqueue([model_vars['input'], 
            model_vars['labels']])],\ 
        feed_dict={model_vars['input']: img_minibatch, 
           model_vars['labels']: labels_minibatch}) 

      if coord.should_stop(): 
       break 

は問題が複数で実行されます(I)enqueue_op()方法、によって引き起こされるように見えスレッド作成スニペット

thr_train = [] 
for i in xrange(12):    

thr_train.append(threading.Thread(target=primary_mb_feeder.enqueue_op, 
             args=(sess, model_vars, coord))) 
       thr_train[-1].setDaemon(True) 
       thr_train[-1].start() 
+0

エンキューオペレーションの作成に使用するコードを共有できますか?欠けているノード名は非常に奇妙で、複数のスレッドが同時にエンキューopsを作成することによって問題が発生したのかどうか、スレッド間で再利用する単一のオペレーションを作成する方が良いでしょう。 (それでもまだバグかもしれません...) – mrry

+0

私はこのオペレーションを実行するスレッドを作成するコードスニペットを使用しているエンキュー操作のコードを貼り付けました。 – ksikka

+0

'primary_mb_feeder'の種類は何ですか? 'enqueue_op'はそのメソッドの1つで、どのように実装されていますか? – mrry

答えて

1

あります(ii)queue.enqueue()を呼び出して、各ミニバッチに対して新しいtf.Operationを作成します。 TensorFlowは、同時にグラフにノードを追加する複数のスレッドをサポートしていません(グラフに変更されていない場合、TensorFlowが最も効率的に機能するため、一般的に非効率です)。

この問題を解決するには、queue.enqueue()を一度呼び出すだけで、すべての入力スレッド間で返された操作を共有し、newでフィードされるそれぞれのsess.run()呼び出しで使用するようにコードをリファクタリングすることをおすすめしますデータ。

+0

ありがとうございました。それが問題を解決しました。 – ksikka

関連する問題