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

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