Membelah dan mengiris

Semua kumpulan data TFDS memaparkan berbagai pemisahan data (misalnya 'train' , 'test' ) yang dapat dieksplorasi dalam katalog . String alfabet apa pun dapat digunakan sebagai nama pemisahan, terpisah dari all (yang merupakan istilah khusus yang sesuai dengan gabungan semua pemisahan, lihat di bawah).

Selain pemisahan kumpulan data "resmi", TFDS memungkinkan untuk memilih bagian dari pemisahan dan berbagai kombinasi.

Mengiris API

Instruksi pemotongan ditentukan di 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%]')

Pemisahan dapat berupa:

  • Nama pemisahan biasa (string seperti 'train' , 'test' , ...): Semua contoh dalam pemisahan dipilih.
  • Irisan : Irisan memiliki semantik yang sama dengan notasi irisan python . Irisan bisa berupa:
    • Absolut ( 'train[123:450]' , train[:4000] ): (lihat catatan di bawah untuk peringatan tentang urutan baca)
    • Persen ( 'train[:75%]' , 'train[25%:75%]' ): Bagilah seluruh data menjadi beberapa bagian. Jika datanya tidak habis dibagi rata, beberapa persen mungkin berisi contoh tambahan. Persen pecahan didukung.
    • Shard ( train[:4shard] , train[4shard] ): Pilih semua contoh di shard yang diminta. (lihat info.splits['train'].num_shards untuk mendapatkan jumlah pecahan yang dipecah)
  • Gabungan pemisahan ( 'train+test' , 'train[:25%]+test' ): Pemisahan akan disisipkan bersama.
  • Kumpulan data lengkap ( 'all' ): 'all' adalah nama pemisahan khusus yang sesuai dengan gabungan semua pemisahan (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-pemisahan 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)

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

Dengan Jax , hal ini dapat disederhanakan lebih lanjut 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 pemisahan apa pun sebagai input (misalnya 'train[75%:]+test' )

Pemotongan dan metadata

Dimungkinkan untuk mendapatkan info tambahan tentang pemisahan/subsplit ( 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)
])

Kumpulan data validasi masing-masing akan menjadi 10%: [0%:10%] , [10%:20%] , ..., [90%:100%] . Dan kumpulan data pelatihan masing-masing akan menjadi 90% yang saling melengkapi: [10%:100%] (untuk kumpulan validasi yang sesuai [0%:10%] ), `[0%:10%]

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

tfds.core.ReadInstruction dan pembulatan

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

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

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

unit dapat berupa:

  • abs : Pengirisan mutlak
  • % : Persen pemotongan
  • shard : Pengirisan pecahan

tfds.ReadInstruction juga memiliki argumen pembulatan. Jika jumlah contoh dalam kumpulan data tidak terbagi rata:

  • rounding='closest' (default): Contoh lainnya didistribusikan ke dalam persen, jadi beberapa persen mungkin berisi contoh tambahan.
  • rounding='pct1_dropremainder' : Contoh yang tersisa dihilangkan, tetapi ini menjamin 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 diacak secara deterministik pada disk. Jadi membuat dataset dua kali (di 2 komputer berbeda) tidak akan mengubah urutan contoh.

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

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