2016-01-04 3 views
8

私たちは私たちがファイル名を生成distorted_inputs()機能でTensorFlow CIFAR-10サンプルチュートリアルのdistorted_inputs()関数は、バッチごとに128個の画像を取得しますか?

images,labels = cifar10.distorted_inputs() 

として画像を取得cifar10_train.pyで列車の機能で今すぐTensorFlow getting started guide for CNN

でCIFAR-10例を経ましたキューを開いて単一のレコードを読み込みます。

# Create a queue that produces the filenames to read. 
filename_queue = tf.train.string_input_producer(filenames) 

# Read examples from files in the filename queue. 
read_input = cifar10_input.read_cifar10(filename_queue) 
reshaped_image = tf.cast(read_input.uint8image, tf.float32) 

deコードを盗み読みすると、read_input変数には、イメージとその高さ、幅、およびラベル名を含むレコードが1つだけ含まれます。

この例題では、読み込んだ画像/レコードに歪みを加えて、_generate_image_and_label_batch()関数に渡します。

この関数は、形状の4Dテンソルを返します。ここで、batch_size = 128です。

上記の関数はバッチを返すときにtf.train.shuffle_batch()関数を使用します。

私の質問は、tf.train.shuffle_batch()機能の余分な記録はどこから来たのですか?私たちはファイル名やリーダーオブジェクトを渡していません。

1レコードから128レコードにどのように変わっていくのか、私は文書を調べましたが、理解できませんでした。

+1

私はまったく同じ質問をしました。私はこれを見つけられたことを嬉しく思いました。 –

答えて

7

tf.train.shuffle_batch()関数は、バッチの入力を含む(1つ以上の)テンソルを生成するために使用できます。内部的には、tf.train.shuffle_batch()tf.RandomShuffleQueueを作成し、その上にq.enqueue()というイメージとラベルのテンソルを付けて、1つの要素(イメージラベルのペア)をエンキューします。 q.dequeue_many(batch_size)の結果を返します。batch_sizeランダムに選択された要素(イメージラベルペア)を1バッチのイメージとラベルのバッチに連結します。

read_inputfilename_queueのようなコードから見ても機能的な関係がありますが、追加のしわがあります。 tf.train.shuffle_batch()の結果を評価するだけで、内部キューに要素が追加されていないため、永遠にブロックされます。これを簡単にするために、tf.train.shuffle_batch()を呼び出すと、TensorFlowはQueueRunnerをグラフの内部コレクションに追加します。後でtf.train.start_queue_runners()を呼び出すと(たとえばhere in cifar10_train.py)、キューに要素を追加するスレッドが開始され、トレーニングを続行できます。 Threading and Queues HOWTOには、この仕組みの詳細が記載されています。

+0

ありがとう、これで多くのことが解決されました。だからキューイングは最初に物事が進む方法の流れを作り、次にスレッドにGOと言うだけで、ファイル名、レコード、その他の場所からのデータの実行と取り込みを開始します。私は正しいと思いますか? – t0mkaka

+0

それはそこにあるすべてのものです。 (キューランナーは、 'tf.OutOfRangeError'が呼び出されたとき' close() 'コールを伝播することで、問題をきれいにシャットダウンすることもサポートしています)。 – mrry

+0

これは素晴らしいトピックですが、私はまだ混乱しています。 tf.train.start_queue_runners()またはtf.train.shuffle_batch()は、キュー内のファイルの読み込み方法と変換方法を知っていますか? distorted_inputs()関数が再び呼び出されることはありません - サンプル画像を生成するために1回だけです。PNGファイルと.txtからラベルを読み取るようにコードを修正したので尋ねます。それは画像を順番に読むようだが、最初のラベルだけを読む。 – Rob

関連する問題