تقسیم و برش

همه مجموعه‌های داده TFDS تقسیم‌های داده‌های مختلفی را نشان می‌دهند (به عنوان مثال 'train' ، 'test' ) که می‌توانند در کاتالوگ بررسی شوند. هر رشته الفبایی را می توان به عنوان نام تقسیم کرد، جدا از all (که یک اصطلاح رزرو شده است که مربوط به اتحاد همه تقسیم‌ها است، به زیر مراجعه کنید).

علاوه بر تقسیم داده های "رسمی"، TFDS امکان انتخاب برش(های) از تقسیم(ها) و ترکیب های مختلف را فراهم می کند.

Slicing 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' , ...): همه نمونه‌های درون تقسیم انتخاب شده‌اند.
  • برش ها : برش ها همان معنایی را با نماد برش پایتون دارند. برش ها می توانند:
    • مطلق ( 'train[123:450]' , train[:4000] ): (برای هشدار در مورد ترتیب خواندن به یادداشت زیر مراجعه کنید)
    • درصد ( 'train[:75%]' , 'train[25%:75%]' ): داده های کامل را به برش های زوج تقسیم کنید. اگر داده ها به طور مساوی قابل تقسیم نیستند، ممکن است برخی از درصدها حاوی مثال های اضافی باشند. درصد کسری پشتیبانی می شوند.
    • Shard ( 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 ، می توان این کار را با استفاده از 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 یک نام مستعار ساده برای:

# 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 هر مقدار تقسیمی را به عنوان ورودی می پذیرد (مثلا 'train[75%:]+test' )

برش و ابرداده

با استفاده از اطلاعات مجموعه داده ها، می توان اطلاعات بیشتری در مورد تقسیم ها/زیر تقسیم ها ( num_examples ، file_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']

اعتبار سنجی متقابل

نمونه هایی از اعتبارسنجی متقابل 10 برابری با استفاده از رشته API:

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 ارسال کرد.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 یک آرگومان گرد نیز دارد. اگر تعداد نمونه در مجموعه داده به طور مساوی تقسیم نشود:

  • rounding='closest' (پیش‌فرض): نمونه‌های باقی‌مانده بین درصد توزیع می‌شوند، بنابراین برخی درصد ممکن است حاوی نمونه‌های اضافی باشند.
  • rounding='pct1_dropremainder' : نمونه‌های باقی‌مانده حذف می‌شوند، اما این تضمین می‌کند که همه درصدها دقیقاً همان تعداد مثال را دارند (به عنوان مثال: len(5%) == 5 * len(1%) .

تکرارپذیری و جبرگرایی

در طول تولید، برای یک نسخه داده داده شده، TFDS تضمین می کند که نمونه ها به طور قطعی بر روی دیسک مخلوط می شوند. بنابراین، دو بار تولید مجموعه داده (در 2 کامپیوتر مختلف) ترتیب نمونه را تغییر نمی دهد.

به طور مشابه، زیرشاخه API همیشه همان set مثال‌ها را بدون توجه به پلتفرم، معماری و غیره انتخاب می‌کند set('train[:20%]') == set('train[:10%]') + set('train[10%:20%]') .

با این حال، ترتیب خواندن مثال‌ها ممکن است قطعی نباشد . این بستگی به پارامترهای دیگر دارد (مثلاً shuffle_files=True ).