همه DatasetBuilder
مجموعه های مختلف داده ای را که به عنوان تقسیم تعریف شده اند ، نشان می دهند (به عنوان مثال: train
، test
). هنگام ساخت یک نمونهtf.data.Dataset
با استفاده از tfds.load()
یا tfds.DatasetBuilder.as_dataset()
، می توان مشخص کرد که کدام تقسیم ها را بازیابی کند. همچنین می توان قطعه (های) تقسیم (ها) و همچنین ترکیبی از آن را بازیابی کرد.
Slicing API
دستورالعمل های برش در tfds.load
یا tfds.DatasetBuilder.as_dataset
مشخص شده است.
دستورالعمل ها می توانند به صورت رشته ای یا ReadInstruction
ارائه شوند. رشته ها برای موارد ساده جمع و جورتر و قابل خواندن هستند ، در حالی که ReadInstruction
گزینه های بیشتری را ارائه می دهد و ممکن است با پارامترهای برش متغیر استفاده از آنها آسان تر باشد.
مثال ها
مثالهایی با استفاده از رشته API:
# The full `train` split.
train_ds = tfds.load('mnist', split='train')
# The full `train` split and the full `test` split as two distinct datasets.
train_ds, test_ds = tfds.load('mnist', split=['train', 'test'])
# The full `train` and `test` splits, interleaved together.
train_test_ds = tfds.load('mnist', split='train+test')
# From record 10 (included) to record 20 (excluded) of `train` split.
train_10_20_ds = tfds.load('mnist', split='train[10:20]')
# The first 10% of train split.
train_10pct_ds = tfds.load('mnist', split='train[:10%]')
# The first 10% of train + the last 80% of train.
train_10_80pct_ds = tfds.load('mnist', split='train[:10%]+train[-80%:]')
# 10-fold cross-validation (see also next section on rounding behavior):
# The validation datasets are each going to be 10%:
# [0%:10%], [10%:20%], ..., [90%:100%].
# And the training datasets are each going to be the complementary 90%:
# [10%:100%] (for a corresponding validation set of [0%:10%]),
# [0%:10%] + [20%:100%] (for a validation set of [10%:20%]), ...,
# [0%:90%] (for a validation set of [90%:100%]).
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)
])
مثالهایی با استفاده از ReadInstruction
API (معادل بالا):
# The full `train` split.
train_ds = tfds.load('mnist', split=tfds.core.ReadInstruction('train'))
# The full `train` split and the full `test` split as two distinct datasets.
train_ds, test_ds = tfds.load('mnist', split=[
tfds.core.ReadInstruction('train'),
tfds.core.ReadInstruction('test'),
])
# The full `train` and `test` splits, interleaved together.
ri = tfds.core.ReadInstruction('train') + tfds.core.ReadInstruction('test')
train_test_ds = tfds.load('mnist', split=ri)
# From record 10 (included) to record 20 (excluded) of `train` split.
train_10_20_ds = tfds.load('mnist', split=tfds.core.ReadInstruction(
'train', from_=10, to=20, unit='abs'))
# The first 10% of train split.
train_10_20_ds = tfds.load('mnist', split=tfds.core.ReadInstruction(
'train', to=10, unit='%'))
# The first 10% of train + the last 80% of train.
ri = (tfds.core.ReadInstruction('train', to=10, unit='%') +
tfds.core.ReadInstruction('train', from_=-80, unit='%'))
train_10_80pct_ds = tfds.load('mnist', split=ri)
# 10-fold cross-validation (see also next section on rounding behavior):
# The validation datasets are each going to be 10%:
# [0%:10%], [10%:20%], ..., [90%:100%].
# And the training datasets are each going to be the complementary 90%:
# [10%:100%] (for a corresponding validation set of [0%:10%]),
# [0%:10%] + [20%:100%] (for a validation set of [10%:20%]), ...,
# [0%:90%] (for a validation set of [90%:100%]).
vals_ds = tfds.load('mnist', [
tfds.core.ReadInstruction('train', from_=k, to=k+10, unit='%')
for k in range(0, 100, 10)])
trains_ds = tfds.load('mnist', [
(tfds.core.ReadInstruction('train', to=k, unit='%') +
tfds.core.ReadInstruction('train', from_=k+10, unit='%'))
for k in range(0, 100, 10)])
tfds.even_splits
tfds.even_splits
لیستی از تقسیمات فرعی با همان اندازه را که همپوشانی tfds.even_splits
ایجاد می کند.
assert tfds.even_splits('train', n=3) == [
'train[0%:33%]', 'train[33%:67%]', 'train[67%:100%]',
]
درصد برش و گرد کردن
اگر برشی از تقسیم با استفاده از واحد درصد ( %
) درخواست شود و مرزهای برش درخواستی به طور مساوی بر 100
تقسیم نشود ، رفتار پیش فرض را برای گرد کردن مرزها به نزدیکترین عدد صحیح ( closest
) انجام می دهد. این بدان معناست که برخی از برش ها ممکن است نمونه های بیشتری نسبت به بقیه داشته باشند. مثلا:
# Assuming "train" split contains 101 records.
# 100 records, from 0 to 100.
tfds.load("mnist", split="test[:99%]")
# 2 records, from 49 to 51.
tfds.load("mnist", split="test[49%:50%]")
همچنین ، کاربر می تواند از pct1_dropremainder
گرد استفاده کند ، بنابراین مرزهای درصدی مشخص شده به صورت مضرب 1٪ در نظر گرفته می شوند. این گزینه باید در مواقعی که قوام لازم است استفاده شود (به عنوان مثال: len(5%) == 5 * len(1%)
). این به این معنی است که اگر info.split[split_name].num_examples % 100 != 0
، آخرین نمونه ها کوتاه می شوند.
مثال:
# Records 0 (included) to 99 (excluded).
split = tfds.core.ReadInstruction(
'test',
to=99,
rounding='pct1_dropremainder',
unit = '%',
)
tfds.load("mnist", split=split)
تکرارپذیری
API تقسیم فرعی تضمین می کند که هر قطعه تقسیم شده داده شده (یا ReadInstruction
) همیشه مجموعه ای از سوابق یکسان را در یک مجموعه داده مشخص تولید می کند ، به ReadInstruction
نسخه اصلی مجموعه داده ثابت باشد.
به عنوان مثال ، tfds.load("mnist:3.0.0", split="train[10:20]")
و tfds.load("mnist:3.2.0", split="train[10:20]")
بدون در نظر گرفتن بستر ، معماری و غیره - همیشه دارای عناصر یکسانی هستند - حتی اگر برخی از سوابق ممکن است مقادیر مختلفی داشته باشند (به عنوان مثال: رمزگذاری تصویر ، برچسب ، ...).