همه مجموعههای داده 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
).