6

背景スレッディングtensorflowの入力パイプラインで

典型的な入力パイプラインが見えます:

    tf.train.string_input_producer(list_of_filenames) 
         (creates queue of filenames) 
            | 
            \|/ 
      fixed length reader reads records from the files 
            | 
            \|/ 
    Read records are decoded and processed(eg if dealing with images then cropping,flipping etc) 
            | 
            \|/ 
      tf.train.shuffle_batch(tensors,num_threads) 
     (creates a shuffling queue and returns batches of tensors) 

問題

Q1)NUM_THREADSの引数は、関数TFではありません.train.string_input_producer()。これは、ファイル名キューからファイル名を読み取るために専用のスレッドが1つしかないことを意味しますか?

Q2)関数tf.train.shuffle_batch()のnum_threads引数の範囲は何ですか?ここで言及したスレッドの数は、ファイルの読み取り、デコード、および処理に使用されるか、バッチを作成するためだけに使用されますかテンソルの?

Q3)どのスレッドが特定のファイルからファイル名またはレコードを読み取るか、つまり各スレッドによって行われた作業の記録の種類を印刷する方法はありますか?

+1

内の要求のリストにそのテンソルを追加し、dequeuedデータという後でグラフでテンソルを要求する必要があると思う避けてください。一度に複数の質問をしています。 1つの質問を複数質問すると、質問はQ/A形式では使用されないため、SOが使用している質問のうちの1つのみに回答することができます。 – etarion

+0

@etarion彼らは複数の質問をするかもしれませんが、それらは高度に相関しています。彼らはすべてテンソルフローの入力パイプラインの一部です。誰かに答えることができる人があれば、ほとんどすべての答えにはっきりと答えることができます。答えについて –

+0

「誰かに答える能力のある人なら、少しでも努力してすべてに答えることができたら」。その声明を出す資格のある人は誰でも質問に答えることができるので、その声明を出すことができれば、自分で質問に答えるのはなぜですか? – etarion

答えて

4

すべてのデータロード操作はテンソルフローグラフ内で実行されます.1つまたは複数のスレッドを起動して、読み取り/エンキュー操作を繰り返し実行することをお勧めします。 Tensorflowは、まさにそれを行うQueueRunnerクラスを提供します。 Coordinatorクラスを使用すると、スレッドを非常に簡単に管理できます。

https://www.tensorflow.org/programmers_guide/threading_and_queues

これは、上記のリンクからのコード例です:あなたは、その後、(、独自のコードでTF操作を使用していない)グラフの外部/前処理サンプルをロードした場合

# Create a queue runner that will run 4 threads in parallel to enqueue 
# examples. 
qr = tf.train.QueueRunner(queue, [enqueue_op] * 4) 

# Launch the graph. 
sess = tf.Session() 
# Create a coordinator, launch the queue runner threads. 
coord = tf.train.Coordinator() 
enqueue_threads = qr.create_threads(sess, coord=coord, start=True) 
# Run the training loop, controlling termination with the coordinator. 
for step in xrange(1000000): 
    if coord.should_stop(): 
     break 
    sess.run(train_op) 
# When done, ask the threads to stop. 
coord.request_stop() 
# And wait for them to actually do it. 
coord.join(enqueue_threads) 

QueueRunnerを使用しないで、ループ内でsess.run(enqueue_op, feed_dict={...})コマンドを使用して独自のクラスを使用してデータをエンキューします。

Q1:qr.create_threads(sess, coord=coord, start=True)

Q2:スレッドの数と処理されTFセッションがスレッドセーフである、tf.run(...)への各呼び出しは、それが開始するときのように、現在の変数の一貫性のあるスナップショットを見ます。 QueueRunnerエンキューopsは任意の数のスレッドを実行できます。それらはスレッドセーフな方法でキューに入れられます。

Q3:私はtf.train.string_input_producer自分自身を使用していないが、私はあなただけsess.run([train_op, dequeue_op])

+0

返信ありがとう!私はちょうど2番目の質問のいくつかの側面をクリアしたいと思います。上のエンキュー操作は、いくつかの社内のテンソルフロー関数(固定長のリーダーとトリミング、エンキューする前にフリップ)を介してデータのいくつかの読み取りと前処理に従ってください。上に並行して実行される4つのスレッドは、データのエンキューや読み込み+前処理+エンキューの役割を担いますか? –

+1

QueueRunnerにopを渡すと、QueueRunnerはループ内でそのopを実行します。それ以上のことはありません(ハウスキーピング以外)。 QueueRunnerにすべての読み込み、前処理、およびエンキューを処理するオペレーションを要求するだけです。 enqueue opはおそらくあなたの前処理に依存するでしょう。これはおそらくあなたの読書に依存するでしょう - それで、エンキューしてTFに適切な依存関係を見つけさせるだけのことです。 –

関連する問題