1. ホーム
  2. tensorflow

[解決済み] Dataset.map, Dataset.prefetch, Dataset.shuffleにおけるbuffer_sizeの意味するところ

2022-09-04 06:41:51

質問

TensorFlowの通り ドキュメント では prefetchmap のメソッドは tf.contrib.data.Dataset クラスでは、どちらも buffer_size .

については prefetch メソッドでは、パラメータは buffer_size で、ドキュメントによると :

buffer_size: tf.int64 スカラー tf.Tensor で、プリフェッチ時にバッファリングされる要素の最大数を表します。 プリフェッチ時にバッファリングされる要素数の最大値を表します。

については map メソッドでは、パラメータは output_buffer_size で、ドキュメントによると :

output_buffer_size: (オプション。) tf.int64スカラー tf.Tensor, バッファリングされる処理済み要素の最大数を表します。 バッファリングされます。

同様に shuffle メソッドでも、同じ量が表示され、ドキュメントによると :

buffer_size: tf.int64スカラー tf.Tensorで、このデータセットから新しいデータセットがサンプリングする要素の数を表します。 新しいデータセットがサンプリングするこのデータセットの要素の数を表します。

これらのパラメータはどのような関係にあるのでしょうか?

仮に Dataset オブジェクトを以下のように作成するとします。

 tr_data = TFRecordDataset(trainfilenames)
    tr_data = tr_data.map(providefortraining, output_buffer_size=10 * trainbatchsize, num_parallel_calls\
=5)
    tr_data = tr_data.shuffle(buffer_size= 100 * trainbatchsize)
    tr_data = tr_data.prefetch(buffer_size = 10 * trainbatchsize)
    tr_data = tr_data.batch(trainbatchsize)

どのような役割を担っているかというと buffer パラメータはどのような役割を担っているのでしょうか?

どのように解決するのですか?

TL;DR 似たような名前ですが、これらの議論は全く異なる意味を持っています。その buffer_sizeDataset.shuffle() はデータセットのランダム性に影響を与えるので、要素が生成される順序も変わります。そのため buffer_size の中に Dataset.prefetch() は、次の要素の生成にかかる時間にのみ影響します。


buffer_size の引数は tf.data.Dataset.prefetch() output_buffer_size の引数を tf.contrib.data.Dataset.map() を調整する方法を提供します。 パフォーマンス のバッファを作成するようTensorFlowに指示します。 buffer_size 要素のバッファを作成し、バックグラウンドでそのバッファを埋めるバックグラウンドスレッドを作成するようTensorFlowに指示します。 (なお、ここでは output_buffer_size から引数を取り除いたことに注意してください。 Dataset.map() から移動したときに tf.contrib.data から tf.data . 新しいコードでは Dataset.prefetch() の後に map() を追加すると、同じ動作になります)。

プリフェッチバッファを追加することで、データの前処理と下流の計算をオーバーラップさせ、パフォーマンスを向上させることができます。一般的に、パイプラインの一番最後に小さなプリフェッチバッファ(おそらく単一の要素のみ)を追加するのが最も有用ですが、より複雑なパイプラインでは、特に単一の要素を生成する時間が変化し得る場合、追加のプリフェッチから利益を得ることができます。

対照的に buffer_size の引数は tf.data.Dataset.shuffle() ランダム性 に影響を与える。私たちは Dataset.shuffle() のような)変換を tf.train.shuffle_batch() 関数のように) を使って、メモリに収まりきらないほど大きなデータセットを処理します。データセット全体をシャッフルするのではなく,バッファに格納された buffer_size 要素のバッファを維持し,そのバッファから次の要素をランダムに選択する(次の入力要素がある場合はそれを置き換える).の値を変更すると buffer_size の値を変更すると、シャッフルの均一性に影響します。 buffer_size がデータセットの要素数より大きい場合は、 一様にシャッフルされます。 1 であれば、シャッフルは全く行われません。非常に大きなデータセットの場合、典型的なquot;good enough"アプローチは、学習前に一度データをランダムに複数のファイルに分割し、ファイル名を一様にシャッフルし、その後より小さなシャッフルバッファを使用することである。しかし、適切な選択は、学習作業の正確な性質に依存します。