TensorFlowの日本語まとめ

TensorFlowの公式サイトに書かれている英文を英語ど素人が翻訳(日本語訳/和訳)します。 間違いがありましたら、優しく教えていただけますと幸いです。 内容を理解したら、使ってみたい。

3.スレッドを作成すると、QueueRunnerオブジェクトを使用してプリフェッチします

ショートバージョン:上記tf.train 機能の多くは、あなたのグラフに QueueRunnerのオブジェクトを追加します。これらは、あなたがどんなトレーニングや推論の手順を実行する前にtf.train.start_queue_runnersを呼び出し、またはそれが永遠にハングアップすることが必要です。これは例を取得するためのデキューが成功するように、例えば、キューを埋める、入力パイプラインを実行するスレッドを開始します。きれいにエラーが発生したこれらのスレッドをシャットダウンする tf.train.Coordinator の最高の組合せです。推奨されるコードパターンが組み合わせられます:

スポンサーリンク

 

# Create the graph, etc.
init_op = tf.initialize_all_variables()

# Create a session for running operations in the Graph.
sess = tf.Session()

# Initialize the variables (like the epoch counter).
sess.run(init_op)

# Start input enqueue threads.
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)

try:
    while not coord.should_stop():
        # Run training steps or whatever
        sess.run(train_op)

except tf.errors.OutOfRangeError:
    print 'Done training -- epoch limit reached'
finally:
    # When done, ask the threads to stop.
    coord.request_stop()

# Wait for threads to finish.
coord.join(threads)
sess.close()

 

余談:ここで何が起こっていますか

 まず、グラフを作成しますこれは、キューで接続されているいくつかのパイプラインステージを持つことになります第一段階は、読み取りとファイル名のキューにエンキューするためのファイル名を生成します。第二段階は、(Readerを使用して)ファイル名を消費する例を生成し、例のキューにエンキューします。あなたが並行して複数のファイルから読み込むことができるように、あなたは物事を設定した方法に応じて、実際に、2段目のいくつかの独立したコピーを有することができます。これらの段階の最後にエンキュー操作は、キューから次の段階のデキューにエンキュー。私たちは、トレーニングループは、例えば、キューから例をデキューすることができるように、これらのエンキュー操作を実行中のスレッドを開始したいです。

f:id:TensorFlow:20160220055904g:plain


これらのキューおよびキューに入れる操作を作成tf.trainにおけるヘルパーはtf.train.add_queue_runner関数を使ってグラフにtf.train.QueueRunnerを追加します。各 QueueRunnerは1段階に責任があり、スレッドで実行する必要がエンキュー操作のリストを保持しています。グラフが構築されるとtf.train.start_queue_runners関数は、グラフ内の各QueueRunnerがエンキュー操作を実行して、そのスレッドを開始するように求められます。

 

すべてがうまくいけばあなたは今、あなたのトレーニングステップを実行することができますし、キューがバックグラウンドスレッドによって入力されます。あなたはいくつかの点で、 tf.OutOfRangeErrorを取得する例をデキューする試みをエポックの上限を設定している場合。これは、「ファイルの終わり」(EOF)のTensorFlow相当である - これはエポック制限に達したことを意味し、これ以上の例が用意されていません。

 

最後の成分は、Coordinatorです。これは、何がシャットダウン合図している場合、すべてのスレッドが知らせる責任があります。例外が発生したため、最も一般的にこれは次のようになります。例えばスレッドの1つは、いくつかの操作を実行してエラー(または通常のPythonの例外を)持ちます。スレッドの詳細については、キュー、QueueRunners、およびCoordinatorsはこちらをご覧ください

 

余談:エポックワークを制限する時のクリーンシャットダウン方法

あなたが訓練するエポック数に制限を設定しているモデルを持っている想像してみてください。つまり、スレッドの生成ファイル名のみが OutOfRangeエラーを生成する前に何度も実行されることを意味します。QueueRunnerは、そのエラーをキャッチし、ファイル名のキューを閉じ、スレッドを終了します。キューを閉じると、2つのことを行います。:

  • 将来の試みはエラーを生成しますファイル名のキューにエンキューします。この時点でそれをやろうとしている任意のスレッドがあってはなりません。しかし、キューが原因で他のエラーに閉じているときにこれは便利です。
  • 現在または将来のデキューは、(十分な要素が残っている場合)成功するか、すぐに(OutOfRangeエラーで失敗します前のポイントによって起こらないから、それらは、より多くの要素がキューに登録されるのを待ってブロックすることはありません

 ポイントは、ファイル名のキューが閉じているときおそらくまだそのキュー内の多くのファイル名なので、いくつかの時間のために実行し続けることができるリーダーおよびその他の前処理とのパイプラインの次のステージが存在することですファイル名のキューが枯渇したらしかし例えば、それが働いていたファイルを終えリーダーからのファイル名をデキューする次の試みOutOfRangeエラーがトリガされますこの場合はしかし、あなた、単一のQueueRunnerに関連した複数のスレッドを持っている可能性がありますこれは、 QueueRunnerで最後のスレッドではない場合、OutOfRangeエラーがちょうど終了する一つのスレッドが発生します。それらが同様に終了するまで、まだ進行し、それらの最後のファイルを仕上げている他のスレッドを可能にします。(あなたはtf.train.Coordinatorを使用していると仮定すると、他のタイプのエラーは、すべてのスレッドが停止します。)すべてのリーダースレッドがOutOfRangeエラーをヒットしたら、次のキューだけにして、例えばキューは閉じます。

 
ここでも、例えば、キューはいくつかの要素がキューイングしていますので、それらがなくなるまでトレーニングが継続されます。例えば、キューがRandomShuffleQueueである場合は、shuffle_batchshuffle_batch_joinを使用しているため、それが通常の緩衝そのmin_after_dequeue attrの要素よりも少ない持つつもりは今まで回避されますと言います。しかし、キューがクローズされた後、その制限が解除され、キューは最終的に空にされます。例えば、キューから、実際の訓練のスレッドは、デキューでOutOfRangeのエラーを取得し出始めます。すべてのトレーニングのスレッドが完了したら、tf.train.Coordinator.joinが返され、正常に終了することができます。

 

レコードごとに複数の例レコードをフィルタリングまたは生産する

シェイプ [x, y, z]と例の代わりに、あなたは形状[batch, x, y, z]との例のバッチを生成します あなたは、レコードごとに複数の例を生産している場合は、バッチ・サイズを使用すると、このレコードを除外したい場合は多分それは設定をホールドアウトしている?)0であること、またはより大きい1することができます。(このようなshuffle_batch または shuffle_batch_joinなど)バッチ処理機能のいずれかを呼び出すとき、そして、単にenqueue_many=Trueを設定します。

 

スパース入力データ

SparseTensorsは、キューと一緒にうまく再生されませんあなたはSparseTensors を使用する場合は、バッチ処理(の代わりにバッチ処理の前に tf.parse_single_exampleを使用して)した後、tf.parse_exampleを使用して文字列レコードをデコードする必要があります

 

 

(原文サイト)

Reading data