Bölme ve dilimleme

Tüm TFDS veri kümeleri, katalogda incelenebilecek çeşitli veri bölmelerini (örneğin 'train' , 'test' ) ortaya çıkarır.

"Resmi" veri kümesi bölmelerine ek olarak, TFDS bölme(ler)in dilim(ler)ini ve çeşitli kombinasyonları seçmeye izin verir.

Dilimleme API'sı

Dilimleme talimatları, split= kwarg aracılığıyla tfds.load veya tfds.DatasetBuilder.as_dataset içinde belirtilir.

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

Bölünmüş olabilir:

  • Düz bölme ( 'train' , 'test' ): Seçilen bölme içindeki tüm örnekler.
  • Dilimler : Dilimler, python dilim gösterimi ile aynı anlama sahiptir. Dilimler şunlar olabilir:
    • Mutlak ( 'train[123:450]' , train[:4000] ): (okuma sırası hakkında uyarı için aşağıdaki nota bakın)
    • Yüzde ( 'train[:75%]' , 'train[25%:75%]' ): Tüm verileri 100 eşit dilime bölün. Veriler 100'e bölünemiyorsa, bazı yüzdeler ek örnekler içerebilir.
    • Shard ( train[:4shard] , train[4shard] ): İstenen parçadaki tüm örnekleri seçin. (bölünmenin parça sayısını almak için info.splits['train'].num_shards )
  • Bölmelerin birleşimi ( 'train+test' , 'train[:25%]+test' ): Bölmeler birlikte serpiştirilecektir.
  • Tam veri kümesi ( 'all' ): 'all' , tüm bölmelerin birleşimine karşılık gelen özel bir bölme adıdır ( 'train+test+...' ile eşdeğerdir).
  • Bölme listesi ( ['train', 'test'] ): Birden çok tf.data.Dataset ayrı olarak döndürülür:
# Returns both train and test split separately
train_ds, test_ds = tfds.load('mnist', split=['train', 'test[:50%]'])

tfds.even_splits ve çoklu ana bilgisayar eğitimi

tfds.even_splits , aynı boyutta örtüşmeyen alt bölümlerin bir listesini oluşturur.

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

Bu, her bir ana bilgisayarın orijinal veriden bir dilim alması gereken dağıtılmış bir ortamda eğitim yaparken özellikle yararlı olabilir.

Jax ile bu, tfds.split_for_jax_process kullanılarak daha da basitleştirilebilir:

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

tfds.split_for_jax_process , aşağıdakiler için basit bir diğer addır:

# 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 herhangi bir bölünmüş değeri girdi olarak kabul eder (örneğin 'train[75%:]+test' )

Dilimleme ve meta veriler

Veri kümesi bilgisini kullanarak bölmeler/alt bölümler ( num_examples , file_instructions ,...) hakkında ek bilgi almak mümkündür:

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

Çapraz doğrulama

API dizesini kullanan 10 katlı çapraz doğrulama örnekleri:

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

Doğrulama veri kümelerinin her biri %10: [0%:10%] , [10%:20%] , ..., [90%:100%] olacaktır. Ve eğitim veri kümelerinin her biri tamamlayıcı %90 olacaktır: [10%:100%] (karşılık gelen [0%:10%] doğrulama kümesi için), `[0%:%10]

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

tfds.core.ReadInstruction ve yuvarlama

str yerine bölmeleri tfds.core.ReadInstruction olarak iletmek mümkündür:

Örneğin, split = 'train[50%:75%] + test' şuna eşdeğerdir:

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

unit olabilir:

  • abs : Mutlak dilimleme
  • % : Yüzde dilimleme
  • shard : Shard dilimleme

tfds.ReadInstruction ayrıca bir yuvarlama argümanına sahiptir. Veri kümesindeki örnek sayısı 100 eşit olarak bölünmüyorsa:

  • rounding='closest' (varsayılan): Kalan örnekler yüzdeye göre dağıtılır, bu nedenle bazı yüzdeler ek örnekler içerebilir.
  • rounding='pct1_dropremainder' : Kalan örnekler çıkarılır, ancak bu, tüm yüzdelerin tam olarak aynı sayıda örneği içerdiğini garanti eder (örneğin: len(5%) == 5 * len(1%) ).

Tekrarlanabilirlik ve determinizm

Oluşturma sırasında, belirli bir veri kümesi sürümü için TFDS, örneklerin disk üzerinde deterministik olarak karıştırılmasını garanti eder. Bu nedenle, veri kümesini iki kez (2 farklı bilgisayarda) oluşturmak, örnek sırayı değiştirmez.

Benzer şekilde, alt bölünmüş API, platform, mimari vb. ne olursa olsun her zaman aynı örnek set seçecektir. Bu, set('train[:20%]') == set('train[:10%]') + set('train[10%:20%]') anlamına gelir. set('train[:20%]') == set('train[:10%]') + set('train[10%:20%]') .

Ancak örneklerin okunma sırası deterministik olmayabilir . Bu, diğer parametrelere bağlıdır (örneğin, shuffle_files=True olup olmadığı).