Membelah dan mengiris

Semua kumpulan data TFDS memaparkan berbagai pemisahan data (misalnya 'train' , 'test' ) yang dapat dieksplorasi dalam katalog .

Selain pemisahan set data "resmi", TFDS memungkinkan untuk memilih irisan dari pemisahan dan berbagai kombinasi.

Mengiris API

Instruksi pemotongan ditentukan dalam tfds.load atau tfds.DatasetBuilder.as_dataset melalui split= kwarg.

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

Perpecahan dapat berupa:

  • Pemisahan biasa ( 'train' , 'test' ): Semua contoh dalam pemisahan yang dipilih.
  • Slices : Slices memiliki semantik yang sama dengan notasi python slice . Irisan bisa berupa:
    • Absolute ( 'train[123:450]' , train[:4000] ): (lihat catatan di bawah untuk peringatan tentang urutan baca)
    • Persen ( 'train[:75%]' , 'train[25%:75%]' ): Bagilah data lengkap menjadi 100 irisan genap. Jika data tidak habis dibagi 100, beberapa persen mungkin berisi contoh tambahan.
    • Shard ( train[:4shard] , train[4shard] ): Pilih semua contoh di shard yang diminta. (lihat info.splits['train'].num_shards untuk mendapatkan jumlah pecahan split)
  • Union of splits ( 'train+test' , 'train[:25%]+test' ): Perpecahan akan disisipkan bersama.
  • Dataset lengkap ( 'all' ): 'all' adalah nama split khusus yang sesuai dengan gabungan semua split (setara dengan 'train+test+...' ).
  • Daftar pemisahan ( ['train', 'test'] ): Beberapa tf.data.Dataset dikembalikan secara terpisah:
# Returns both train and test split separately
train_ds, test_ds = tfds.load('mnist', split=['train', 'test[:50%]'])

tfds.even_splits & pelatihan multi-host

tfds.even_splits menghasilkan daftar sub-split yang tidak tumpang tindih dengan ukuran yang sama.

# 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)

Ini bisa sangat berguna saat pelatihan dalam pengaturan terdistribusi, di mana setiap host harus menerima sepotong data asli.

Dengan Jax , ini dapat disederhanakan lebih jauh lagi menggunakan tfds.split_for_jax_process :

split = tfds.split_for_jax_process('train', drop_remainder=True)
ds = tfds.load('my_dataset', split=split)

tfds.split_for_jax_process adalah alias sederhana untuk:

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

tfds.even_splits , tfds.split_for_jax_process menerima nilai split apa pun sebagai input (mis 'train[75%:]+test' )

Mengiris dan metadata

Dimungkinkan untuk mendapatkan info tambahan tentang split/subsplits ( num_examples , file_instructions ,...) menggunakan dataset info :

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']

Validasi silang

Contoh validasi silang 10 kali lipat menggunakan API string:

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)
])

Dataset validasi masing-masing akan menjadi 10%: [0%:10%] , [10%:20%] , ..., [90%:100%] . Dan set data pelatihan masing-masing akan menjadi pelengkap 90%: [10%:100%] (untuk set validasi terkait [0%:10%] ), `[0%: 10%]

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

tfds.core.ReadInstruction dan pembulatan

Daripada str , dimungkinkan untuk melewatkan pemisahan sebagai tfds.core.ReadInstruction :

Misalnya, split = 'train[50%:75%] + test' sama dengan:

split = (
    tfds.core.ReadInstruction(
        'train',
        from_=50,
        to=75,
        unit='%',
    )
    + tfds.core.ReadInstruction('test')
)
ds = tfds.load('my_dataset', split=split)

unit dapat:

  • abs : Mengiris mutlak
  • % : Persen irisan
  • shard : Pemotongan pecahan

tfds.ReadInstruction juga memiliki argumen pembulatan. Jika jumlah contoh dalam dataset tidak dibagi rata dengan 100 :

  • rounding='closest' (default): Contoh yang tersisa didistribusikan di antara persen, jadi beberapa persen mungkin berisi contoh tambahan.
  • rounding='pct1_dropremainder' : Contoh yang tersisa dihilangkan, tetapi jaminan ini semua persen berisi jumlah contoh yang sama persis (misalnya: len(5%) == 5 * len(1%) ).

Reproduksibilitas & determinisme

Selama pembuatan, untuk versi kumpulan data tertentu, TFDS menjamin bahwa contoh dikocok secara deterministik pada disk. Jadi menghasilkan kumpulan data dua kali (di 2 komputer berbeda) tidak akan mengubah urutan contoh.

Demikian pula, API subsplit akan selalu memilih set contoh yang sama, terlepas dari platform, arsitektur, dll. Ini berarti set('train[:20%]') == set('train[:10%]') + set('train[10%:20%]') .

Namun, urutan contoh yang dibaca mungkin tidak deterministik. Ini tergantung pada parameter lain (misalnya apakah shuffle_files=True ).