2016-06-17 11 views
1

テンソルフローでのキューイングとデキューの仕組みを読んできたので、ファイル名キューを作ってそこから抜け出しています。スレッドを開始した直後のデキューは失敗する

スレッドを開始した直後にデキューしようとすると、残念ながらエラーが発生します。これには理由がありますか?私が1秒のスリープタイマーを入れると、デキューされます。そうでない場合、それは時々動作しますが、多くの場合、(コードの下に示す)例外がスローされます

import tensorflow as tf 
import time 
with tf.Graph().as_default(): 
    filename_list = ['data_batch_{}.mat'.format(i+1) for i in range(5)] 
    filename_queue = tf.train.string_input_producer(filename_list) 

    with tf.Session() as sess: 
     coord = tf.train.Coordinator() 
     threads = tf.train.start_queue_runners(sess=sess, coord=coord) 

     #time.sleep(1) # If I uncomment this it works 
     for i in range(5): 
      print(sess.run(filename_queue.dequeue())) 

     coord.request_stop() 
     coord.join(threads) 

と例外がスローさ:私たちはこの問題について知らせるため

--------------------------------------------------------------------------- 
NotFoundError        Traceback (most recent call last) 
<ipython-input-28-cf6ab7b71f22> in <module>() 
    10   #time.sleep(1) 
    11   for i in range(5): 
---> 12    print(sess.run(filename_queue.dequeue())) 
    13 
    14   coord.request_stop() 

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc in run(self, fetches, feed_dict, options, run_metadata) 
    331  try: 
    332  result = self._run(None, fetches, feed_dict, options_ptr, 
--> 333       run_metadata_ptr) 
    334  if run_metadata: 
    335   proto_data = tf_session.TF_GetBuffer(run_metadata_ptr) 

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc in _run(self, handle, fetches, feed_dict, options, run_metadata) 
    571  try: 
    572  results = self._do_run(handle, target_list, unique_fetches, 
--> 573        feed_dict_string, options, run_metadata) 
    574  finally: 
    575  # The movers are no longer used. Delete them. 

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc in _do_run(self, handle, target_list, fetch_list, feed_dict, options, run_metadata) 
    646  if handle is None: 
    647  return self._do_call(_run_fn, self._session, feed_dict, fetch_list, 
--> 648       target_list, options, run_metadata) 
    649  else: 
    650  return self._do_call(_prun_fn, self._session, handle, feed_dict, 

/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc in _do_call(self, fn, *args) 
    666   except KeyError: 
    667   pass 
--> 668  raise type(e)(node_def, op, message) 
    669 
    670 def _extend_graph(self): 

NotFoundError: FetchOutputs node input_producer_Dequeue:0: not found 
+0

が行 'sess.run()'タイプミスですか? –

+0

はい、申し訳ありません。そのため、別のエラーが発生します。私はそれを編集しました。 – Fergal

+0

'dequeue_op = filename_queue.dequeue()'を前に追加してから 'sess.run(dequeue_op)'を呼び出せますか? –

答えて

1

感謝を。対応する GitHub issueを提出し、すぐにリポジトリに表示される修正を用意しました。

一方で、次のコードは、セッションを開始する前に、単一のdequeue()オペアンプを作成することで、動作するはずですが:

import tensorflow as tf 
with tf.Graph().as_default(): 
    filename_list = ['data_batch_{}.mat'.format(i+1) for i in range(5)] 
    filename_queue = tf.train.string_input_producer(filename_list) 
    dequeued_t = filename_queue.dequeue() 

    with tf.Session() as sess: 
     coord = tf.train.Coordinator() 
     threads = tf.train.start_queue_runners(sess=sess, coord=coord) 

     for i in range(5): 
      print(sess.run(dequeued_t)) 

     coord.request_stop() 
     coord.join(threads) 
+0

これはうまくいきます。上記のコードを実行すると、およそ50%の時間で動作し、このコードは100%の時間で正常に動作します。 – Fergal

+0

私は[GitHubの問題](https://github.com/tensorflow/tensorflow/issues/2957)を修正しています.TensorFlow 0.10を試してみると、既存のコードが機能するはずです。しかし、私の答えのコードは、それが 'sess.run(filename_queue.dequeue())よりも少ないので、' 'sess.run(dequeued_t) )。 – mrry

+0

ああ。私の元のコードは、各ループ反復のグラフに新しいopを追加しますか?また、あなたのコードは、セッションが作成される前に演算子を作成します。 – Fergal

関連する問題