Split とスライス
すべての TFDS データセットは、カタログで詳しく見ることのできる様々なデータの Split('train'、'test' など)を公開します。Split 名には、all(すべての Split の結合に対応する予約語。以下参照)を除く任意の英字の文字列を使用できます。
TFDS では、「公式」のデータセットの Split に加え、Split のスライスやさまざまな組み合わせを選択することができます。
スライス API
スライスの指示は tfds.load または tfds.DatasetBuilder.as_dataset に split= kwarg を介して指定されます。
Split には次のものがあります。
プレーンな Split 名(
'train'、'test'などの文字列): 選択された Split 内のすべての Example。スライス: スライスのセマンティックはPython のスライス表記法と同じです。スライスには次のものがあります。
絶対 (
'train[123:450]'、train[:4000]): (読み取り順序に関する警告については、以下の注意事項を参照してください)パーセント率(
'train[:75%]'、'train[25%:75%]'): 全データを 100 個の均一なスライスに分けます。データを均等に割り切れない場合は、一部の 100 分の 1 のスライスに追加の Example が含まれる場合があります。小数点以下のパーセントはサポートされています。シャード(
train[:4shard]、train[4shard]): リクエストされたシャードのすべての Example を選択します。(Split のシャード数を取得するには、info.splits['train'].num_shardsを確認します。)
Split の和集合(
'train+test'、'train[:25%]+test'): Split は共にインターリーブされます。完全なデータセット (
'all'):'all'すべての Split の和集合に対応する特別な Split 名です ('train+test+...'と同等)。Split のリスト(
['train', 'test']): 次のようにして、複数のtf.data.Datasetが個別に返されます。
注意: シャードはインターリーブされるため、サブスプリット間での順序の一貫性は保証されません。つまり、test[0:100] の後に test[100:200] を読み取る場合と test[:200] を読み取る場合では、Example の順序が異なることがあります。TFDS が Example を読み取る順序についての詳細は、決定論ガイドを参照してください。
tfds.even_splits とマルチホストトレーニング
tfds.even_splits は、オーバーラップしない同じサイズのサブスプリットのリストを生成します。
これは特に、ホストごとに元のデータのスライスを受け取る必要のある分散環境でのトレーニングに役立ちます。
Jax では、tfds.split_for_jax_process を使用してさらにこれを単純化できます。
tfds.split_for_jax_process は以下の単純なエイリアスです。
tfds.even_splits、tfds.split_for_jax_process は任意の Split 値を入力として受け入れます(例: 'train[75%:]+test')。
スライスとメタデータ
Split/サブスプリットに関する追加情報(num_examples、file_instructions など)は、データセットの info を使って取得することができます。
クロス検証
文字列 API を使った 10 段階クロス検証の例:
検証データセットは、[0%:10%], [10%:20%], ..., [90%:100%] というように、それぞれ 10% になります。また、トレーニングデータセットは、[10%:100%](対応する検証セットの [0%:10%])、`[0%:10%] というようにそれぞれ補完する 90% になります。
[20%:100%]
(検証セットの[10%:20%]`),...
tfds.core.ReadInstruction と四捨五入
Split は、str ではなく、tfds.core.ReadInstruction として渡すことが可能です。
たとえば、split = 'train[50%:75%] + test' は次と同等です。
unit は、次であることができます。
abs: 全体的スライス%: パーセント率スライスshard: シャードスライス
tfds.ReadInstruction には四捨五入の引数もあります。データセットの Example 数が均等に割り切れない場合は、次のようになります。
rounding='closest'(デフォルト): 残りの Example は、パーセント率で配分され、一部のパーセントに追加の Example が含まれることがあります。rounding='pct1_dropremainder': 残りの Example はドロップされますが、こうすることですべての 100 分の 1 スライスにまったく同じ数の Example が確実に含まれることになります(len(5%) == 5 * len(1%)など)。
再現可能性と決定性
生成中、特定のデータセットのバージョンにおいて、TFDS はExample が決定的にディスクでシャッフルされることを保証します。そのため、データセットを 2 回生成しても(2 台のコンピュータで)、Example の順序は変わりません。
同様に、サブスプリット API は必ず Example の同じ set を選択し、これにはプラットフォームやアーキテクチャなどは考慮されません。つまり、set('train[:20%]') == set('train[:10%]') + set('train[10%:20%]') となります。
ただし、Example が読み取られる順序は決定的ではない場合があります。これは他のパラメータshuffle_files=True であるかどうか)に依存しています。