分割とスライス

すべてのTFDSデータセットは、各種データの分割(例えば公開'train''test'で検討することができます)カタログを

「公式」データセット分割に加えて、TFDSでは分割のスライスとさまざまな組み合わせを選択できます。

スライスAPI

スライス命令がで指定されているtfds.loadまたはtfds.DatasetBuilder.as_datasetを通じてsplit= kwarg。

ds = tfds.load('my_dataset', split='train[:75%]')
builder = tfds.builder('my_dataset')
ds = builder.as_dataset(split='test+train[:75%]')

分割は次のようになります。

  • 平野スプリット'train''test' ):選択したスプリット内のすべての例。
  • スライス:スライスは、同じセマンティックを持つPythonのスライス表記。スライスは次のようになります。
    • 絶対'train[123:450]' train[:4000]読み取り順序について警告用のノート怒鳴るを参照してください)
    • パーセント'train[:75%]' 'train[25%:75%]'枚のもスライスに完全なデータを分割。データが100で割り切れない場合、一部のパーセントには追加の例が含まれている可能性があります。
    • シャードtrain[:4shard] train[4shard]要求されたシャードのすべての例を選択します。 (参照info.splits['train'].num_shardsスプリットの破片の数を取得するために)
  • スプリットユニオン'train+test''train[:25%]+test' ):スプリットを一緒にインタリーブされます。
  • 完全なデータセット'all' ): 'all' (と同等のすべての分割の和集合に対応する特別なスプリット名である'train+test+...' )。
  • 分割のリスト['train', 'test']複数のtf.data.Dataset個別に返されます。
# Returns both train and test split separately
train_ds, test_ds = tfds.load('mnist', split=['train', 'test[50%]'])

tfds.even_splits &マルチホストトレーニング

tfds.even_splits同じ大きさの、非重複サブ分割のリストを生成します。

# Divide the dataset into 3 even parts, each containing 1/3 of the data
split0, split1, split2 = tfds.even_splits('train', n=3)

ds = tfds.load('my_dataset', split=split2)

これは、各ホストが元のデータのスライスを受信する必要がある分散設定でトレーニングする場合に特に役立ちます。 jaxの例を次に示します。

splits = tfds.even_splits('train', n=jax.process_count(), drop_remainder=True)
# The current `process_index` load only `1 / process_count` of the data.
ds = tfds.load('my_dataset', split=splits[jax.process_index()])

tfds.even_splits入力(例えば、任意の分割値に受け入れ'train[75%:]+test'

スライスとメタデータ

それは、スプリット/ subsplitsに追加情報を取得することが可能である( num_examplesfile_instructions 、...)を使用して、データセットの情報を

builder = tfds.builder('my_dataset')
builder.info.splits['train'].num_examples  # 10_000
builder.info.splits['train[:75%]'].num_examples  # 7_500 (also works with slices)
builder.info.splits.keys()  # ['train', 'test']

相互検証

文字列APIを使用した10分割交差検定の例:

vals_ds = tfds.load('mnist', split=[
    f'train[{k}%:{k+10}%]' for k in range(0, 100, 10)
])
trains_ds = tfds.load('mnist', split=[
    f'train[:{k}%]+train[{k+10}%:]' for k in range(0, 100, 10)
])

検証データセットはそれぞれ10%としている: [0%:10%][10%:20%] 、...、 [90%:100%] 。 :トレーニングデータセットは、それぞれの相補90%であることを行っている[10%:100%] (の対応する検証セットのために[0%:10%] )、 `[0%:10%]

  • 【20%:100%] (for a validation set of [10%:20%] `)、...

tfds.core.ReadInstructionと丸め

むしろよりstr 、として分割を渡すことができtfds.core.ReadInstruction

例えば、 split = 'train[50%:75%] + test'と等価です。

split = (
    tfds.core.ReadInstruction(
        'train',
        from_=50,
        to=75,
        unit='%',
    )

    + tfds.core.ReadInstruction('test')
)
ds = tfds.load('my_dataset', split=split)

unitすることができ:

  • abs :絶対スライシング
  • % :パーセントスライシング
  • shard :シャードスライシング

tfds.ReadInstructionまた、丸め引数があります。データセットの例の数は、によって均等に分割されていない場合に100

  • rounding='closest' (デフォルト):残りの例は、パーセントの間に分散されているので、いくつかのパーセントは、追加の例が含まれている場合があります。
  • rounding='pct1_dropremainder' 、残りの例は廃棄され、この保証すべてのパーセントは、例えば正確な同じ番号が含まれています(例: len(5%) == 5 * len(1%)

再現性と決定論

生成中、特定のデータセットバージョンについて、TFDSは、例がディスク上で決定論的にシャッフルされることを保証します。したがって、データセットを2回(2台の異なるコンピューターで)生成しても、例の順序は変わりません。

同様に、subsplit APIは常に同じ選択するsetに関係なく等プラットフォーム、アーキテクチャ、この平均例をset('train[:20%]') == set('train[:10%]') + set('train[10%:20%]')

しかし、例が読まれる順序は確定的ではないかもしれません。これは、他のパラメータ(例えばかどうかに依存shuffle_files=True )。