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