מפצלים ופורסים

כל מערכי הנתונים של 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 ).