تقسیم و برش

با مجموعه‌ها، منظم بمانید ذخیره و دسته‌بندی محتوا براساس اولویت‌های شما.

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

علاوه بر تقسیم داده های "رسمی"، 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%]' ): داده های کامل را به 100 برش زوج تقسیم کنید. اگر داده‌ها بر 100 بخش‌پذیر نباشند، ممکن است چند درصد شامل نمونه‌های اضافی باشد.
    • 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 ارسال کرد. tfds.core.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 یک آرگومان گرد نیز دارد. اگر تعداد نمونه در مجموعه داده به طور مساوی بر 100 تقسیم نشود:

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

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

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

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

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