2017-11-01 13 views
4

TFの新機能、つまりData APIを使用しようとしていますが、プリフェッチがどのように機能するのかよくわかりません。私はdataset=dataset.prefetch(batch_size)を入れて上Tensorflow Data API - プリフェッチ

def dataset_input_fn(...) 
    dataset = tf.data.TFRecordDataset(filenames, compression_type="ZLIB") 
    dataset = dataset.map(lambda x:parser(...)) 
    dataset = dataset.map(lambda x,y: image_augmentation(...) 
         , num_parallel_calls=num_threads 
        ) 

    dataset = dataset.shuffle(buffer_size) 
    dataset = dataset.batch(batch_size)  
    dataset = dataset.repeat(num_epochs) 
    iterator = dataset.make_one_shot_iterator() 

次のコードでは、各ラインの間には関係ありませんか?または、データセットがtf.contrib.dataから来ている場合は、output_buffer_sizeを使用するすべての操作の後にする必要がありますか?

私はmrryによってコメント見つかっ github上の議論で

答えて

3

:TF 1.4で は、それが簡単にパイプライン内の任意の時点でプリフェッチを追加することができDataset.prefetch()メソッドがあることを

注意を、マップの直後には ではありません。 (現在の毎晩 ビルドをダウンロードして、それを試すことができます。)

例えば、Dataset.prefetch()のような役割を果たし注文したバッファを移入 にバックグラウンドスレッドを開始しますtf.FIFOQueueであるため、 下流のパイプラインステージをブロックする必要はありません。ただし、prefetch() の実装は、 として多くの異なる同時操作をtf.FIFOQueueとしてサポートする必要がないため、はるかに簡単です。

これは、プリフェッチはどのコマンドでも実行できることを意味し、前のコマンドで動作します。これまでのところ、私はそれを最後に置くだけで最大のパフォーマンスが得られたことに気づいています。

Meaning of buffer_size in Dataset.map , Dataset.prefetch and Dataset.shuffleについてさらに説明します。ここでmrryはプリフェッチとバッファについてもう少し説明します。