Bölme ve dilimleme

Tüm TFDS veri kümeleri, katalogda incelenebilecek çeşitli veri bölümlerini (örneğin 'train' , 'test' ) açığa çıkarır. all dışında herhangi bir alfabetik dizi, bölünmüş ad olarak kullanılabilir (bu, tüm bölmelerin birleşimine karşılık gelen ayrılmış bir terimdir, aşağıya bakın).

"Resmi" veri kümesi bölmelerine ek olarak TFDS, bölme dilimlerinin ve çeşitli kombinasyonların seçilmesine olanak tanır.

Dilimleme API'si

Dilimleme talimatları tfds.load veya tfds.DatasetBuilder.as_dataset dosyasında split= kwarg aracılığıyla belirtilir.

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

Bölme şunlar olabilir:

  • Düz bölme adları ( 'train' , 'test' , ... gibi bir dize): Seçilen bölme içindeki tüm örnekler.
  • Dilimler : Dilimler, python dilim gösterimiyle aynı anlama sahiptir. Dilimler şunlar olabilir:
    • Mutlak ( 'train[123:450]' , train[:4000] ): (okuma sırası ile ilgili uyarı için aşağıdaki nota bakın)
    • Yüzde ( 'train[:75%]' , 'train[25%:75%]' ): Tüm verileri eşit dilimlere bölün. Veriler eşit olarak bölünemiyorsa yüzdelerin bir kısmı ek örnekler içerebilir. Kesirli yüzde desteklenir.
    • Parça ( 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 bakın)
  • 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 fazla tf.data.Dataset ayrı ayrı 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ı boyuttaki ö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 ana bilgisayarın orijinal veriden bir dilim alması gereken dağıtılmış bir ortamda eğitim yaparken özellikle yararlı olabilir.

Jax 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 takma 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ölme değerini girdi olarak kabul eder (örn. '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

Dize API'sini 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 olacaktır: [0%:10%] , [10%:20%] , ..., [90%:100%] . 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 : Parça dilimleme

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

  • rounding='closest' (varsayılan): Kalan örnekler yüzdeler arasında dağıtılmıştır, dolayısıyla yüzdelerin bir kısmı ek örnekler içerebilir.
  • rounding='pct1_dropremainder' : Kalan örnekler çıkarıldı, ancak bu, tüm yüzdelerin tam olarak aynı sayıda örnek 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 diskte deterministik olarak karıştırıldığını garanti eder. Dolayısıyla veri kümesinin iki kez (2 farklı bilgisayarda) oluşturulması örnek sırasını değiştirmeyecektir.

Benzer şekilde, alt bölme API'si 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ı belirleyici olmayabilir . Bu, diğer parametrelere bağlıdır (örn. shuffle_files=True olup olmadığına).