כל מערכי הנתונים של TFDS חושפים פיצולי נתונים שונים (למשל 'train'
, 'test'
) שניתן לחקור בקטלוג . כל מחרוזת אלפביתית יכולה לשמש כשם מפוצל, מלבד all
(שהוא מונח שמור שמתאים לאיחוד של כל הפיצולים, ראה להלן).
בנוסף לפיצולי הנתונים ה"רשמיים", TFDS מאפשרים לבחור פרוסות של פיצולים ושילובים שונים.
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%]'
): חלק את הנתונים המלאים לפרוסות שוות. אם הנתונים אינם ניתנים לחלוקה שווה, אחוזים מסוימים עשויים להכיל דוגמאות נוספות. אחוזים חלקיים נתמכים. - שבר (
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
:
לדוגמה, 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
).