בוני ערכות נתונים ספציפיים לפורמט

מדריך זה מתעד את כל בוני הנתונים הספציפיים לפורמט הזמינים כעת ב-TFDS.

בוני נתונים ספציפיים לפורמט הם תת-מחלקות של tfds.core.GeneratorBasedBuilder אשר דואגים לרוב עיבוד הנתונים עבור פורמט נתונים ספציפי.

מערכי נתונים המבוססים על tf.data.Dataset

אם ברצונך ליצור מערך נתונים של TFDS מתוך מערך נתונים בפורמט tf.data.Dataset ( reference ), אז אתה יכול להשתמש ב- tfds.dataset_builders.TfDataBuilder (ראה מסמכי API ).

אנו מדמיינים שני שימושים אופייניים למחלקה זו:

  • יצירת מערכי נתונים ניסיוניים בסביבה דמוית מחברת
  • הגדרת בונה מערכי נתונים בקוד

יצירת מערך נתונים חדש ממחברת

נניח שאתה עובד במחברת, טען נתונים מסוימים כ- tf.data.Dataset , החלת טרנספורמציות שונות (מפה, מסנן וכו') ועכשיו אתה רוצה לאחסן את הנתונים האלה ולשתף אותם בקלות עם חברי הצוות או לטעון אותם במחברות אחרות. במקום להגדיר מחלקה חדשה של בונה מערך נתונים, תוכל גם ליצור מופע tfds.dataset_builders.TfDataBuilder ולקרוא ל- download_and_prepare כדי לאחסן את מערך הנתונים שלך כמערך נתונים של TFDS.

מכיוון שזה מערך נתונים TFDS, אתה יכול לגרסתו, להשתמש בהגדרות, לקיים פיצולים שונים ולתעד אותו לשימוש קל יותר מאוחר יותר. זה אומר שאתה גם צריך לספר ל-TFDS מהן התכונות במערך הנתונים שלך.

הנה דוגמה דמה איך אתה יכול להשתמש בו.

import tensorflow as tf
import tensorflow_datasets as tfds

my_ds_train = tf.data.Dataset.from_tensor_slices({"number": [1, 2, 3]})
my_ds_test = tf.data.Dataset.from_tensor_slices({"number": [4, 5]})

# Optionally define a custom `data_dir`.
# If None, then the default data dir is used.
custom_data_dir = "/my/folder"

# Define the builder.
single_number_builder = tfds.dataset_builders.TfDataBuilder(
    name="my_dataset",
    config="single_number",
    version="1.0.0",
    data_dir=custom_data_dir,
    split_datasets={
        "train": my_ds_train,
        "test": my_ds_test,
    },
    features=tfds.features.FeaturesDict({
        "number": tfds.features.Scalar(dtype=tf.int64),
    }),
    description="My dataset with a single number.",
    release_notes={
        "1.0.0": "Initial release with numbers up to 5!",
    }
)

# Make the builder store the data as a TFDS dataset.
single_number_builder.download_and_prepare()

שיטת download_and_prepare תחזור על הקלט tf.data.Dataset s ותשמור את מערך הנתונים של TFDS המתאים ב- /my/folder/my_dataset/single_number/1.0.0 my_dataset/single_number/1.0.0, שיכיל גם את פיצולי הרכבת וגם את הבדיקה.

הארגומנט config הוא אופציונלי ויכול להיות שימושי אם ברצונך לאחסן תצורות שונות תחת אותו מערך נתונים.

ניתן להשתמש בארגומנט data_dir כדי לאחסן את מערך הנתונים של TFDS שנוצר בתיקייה אחרת, למשל בארגז החול שלך אם אינך רוצה לשתף את זה עם אחרים (עדיין). שימו לב שכאשר עושים זאת, עליכם גם להעביר את data_dir אל tfds.load . אם הארגומנט data_dir לא צוין, אזי ישמש ברירת המחדל של TFDS data dir.

טוען את מערך הנתונים שלך

לאחר שמערך הנתונים של TFDS אוחסן, ניתן לטעון אותו מסקריפטים אחרים או על ידי חברי צוות אם יש להם גישה לנתונים:

# If no custom data dir was specified:
ds_test = tfds.load("my_dataset/single_number", split="test")

# When there are multiple versions, you can also specify the version.
ds_test = tfds.load("my_dataset/single_number:1.0.0", split="test")

# If the TFDS was stored in a custom folder, then it can be loaded as follows:
custom_data_dir = "/my/folder"
ds_test = tfds.load("my_dataset/single_number:1.0.0", split="test", data_dir=custom_data_dir)

הוספת גרסה או תצורה חדשה

לאחר איטרציה נוספת על מערך הנתונים שלך, ייתכן שהוספת או שינית חלק מהטרנספורמציות של נתוני המקור. כדי לאחסן ולשתף מערך נתונים זה, תוכל לאחסן אותו בקלות כגרסה חדשה.

def add_one(example):
  example["number"] = example["number"] + 1
  return example

my_ds_train_v2 = my_ds_train.map(add_one)
my_ds_test_v2 = my_ds_test.map(add_one)

single_number_builder_v2 = tfds.dataset_builders.TfDataBuilder(
    name="my_dataset",
    config="single_number",
    version="1.1.0",
    data_dir=custom_data_dir,
    split_datasets={
        "train": my_ds_train_v2,
        "test": my_ds_test_v2,
    },
    features=tfds.features.FeaturesDict({
        "number": tfds.features.Scalar(dtype=tf.int64, doc="Some number"),
    }),
    description="My dataset with a single number.",
    release_notes={
        "1.1.0": "Initial release with numbers up to 6!",
        "1.0.0": "Initial release with numbers up to 5!",
    }
)

# Make the builder store the data as a TFDS dataset.
single_number_builder_v2.download_and_prepare()

הגדרת מחלקה חדשה לבניית מערכי נתונים

אתה יכול גם להגדיר DatasetBuilder חדש המבוסס על מחלקה זו.

import tensorflow as tf
import tensorflow_datasets as tfds

class MyDatasetBuilder(tfds.dataset_builders.TfDataBuilder):
  def __init__(self):
    ds_train = tf.data.Dataset.from_tensor_slices([1, 2, 3])
    ds_test = tf.data.Dataset.from_tensor_slices([4, 5])
    super().__init__(
        name="my_dataset",
        version="1.0.0",
        split_datasets={
            "train": ds_train,
            "test": ds_test,
        },
        features=tfds.features.FeaturesDict({
            "number": tfds.features.Scalar(dtype=tf.int64),
        }),
        config="single_number",
        description="My dataset with a single number.",
        release_notes={
            "1.0.0": "Initial release with numbers up to 5!",
        })

CroissantBuilder

הפורמט

Croissant 🥐 הוא פורמט ברמה גבוהה עבור מערכי נתונים של למידת מכונה המשלב מטא נתונים, תיאורי קבצי משאבים, מבנה נתונים וסמנטיקה של ברירת מחדל של ML לקובץ אחד; זה עובד עם מערכי נתונים קיימים כדי להקל עליהם למצוא, להשתמש בהם ולתמוך בהם בכלים.

Croissant בונה על schema.org ואוצר המילים שלו sc:Dataset , פורמט בשימוש נרחב לייצוג מערכי נתונים באינטרנט ולהפוך אותם לניתנים לחיפוש.

CroissantBuilder

CroissantBuilder מגדיר מערך נתונים TFDS המבוסס על קובץ מטא נתונים של Croissant 🥐; כל אחד מה- record_set_ids שצוינו יביא ל- ConfigBuilder נפרד.

לדוגמה, כדי לאתחל CroissantBuilder עבור מערך הנתונים של MNIST באמצעות הגדרת Croissant 🥐 שלו:

import tensorflow_datasets as tfds
builder = tfds.dataset_builders.CroissantBuilder(
    jsonld="https://raw.githubusercontent.com/mlcommons/croissant/main/datasets/0.8/huggingface-mnist/metadata.json",
    file_format='array_record',
)
builder.download_and_prepare()
ds = builder.as_data_source()
print(ds['default'][0])

קונל

הפורמט

CoNLL הוא פורמט פופולרי המשמש לייצוג נתוני טקסט מוערים.

נתונים בפורמט CoNLL מכילים בדרך כלל אסימון אחד עם ההערות הלשוניות שלו בכל שורה; בתוך אותה שורה, הערות מופרדות בדרך כלל על ידי רווחים או טאבים. קווים ריקים מייצגים גבולות משפטים.

שקול כדוגמה את המשפט הבא ממערך הנתונים של conll2003 , העוקב אחר פורמט ההערה של CoNLL:

U.N. NNP I-NP I-ORG official
NN I-NP O
Ekeus NNP I-NP I-PER
heads VBZ I-VP O
for IN I-PP O
Baghdad NNP I-NP
I-LOC . . O O

ConllDatasetBuilder

כדי להוסיף מערך נתונים חדש מבוסס CoNLL ל-TFDS, אתה יכול לבסס את מחלקת בונה הנתונים שלך על tfds.dataset_builders.ConllDatasetBuilder . מחלקה בסיס זו מכילה קוד נפוץ להתמודדות עם הספציפיות של מערכי נתונים של CoNLL (חזרה על הפורמט מבוסס העמודות, רשימות הידור מראש של תכונות ותגים, ...).

tfds.dataset_builders.ConllDatasetBuilder מיישם GeneratorBasedBuilder ספציפי ל-CoNLL. עיין במחלקה הבאה כדוגמה מינימלית של בונה נתונים של CoNLL:

from tensorflow_datasets.core.dataset_builders.conll import conll_dataset_builder_utils as conll_lib
import tensorflow_datasets.public_api as tfds

class MyCoNNLDataset(tfds.dataset_builders.ConllDatasetBuilder):
  VERSION = tfds.core.Version('1.0.0')
  RELEASE_NOTES = {'1.0.0': 'Initial release.'}

  # conllu_lib contains a set of ready-to-use CONLL-specific configs.
  BUILDER_CONFIGS = [conll_lib.CONLL_2003_CONFIG]

  def _info(self) -> tfds.core.DatasetInfo:
    return self.create_dataset_info(
        # ...
    )

  def _split_generators(self, dl_manager):
    path = dl_manager.download_and_extract('https://data-url')

    return {'train': self._generate_examples(path=path / 'train.txt'),
            'test': self._generate_examples(path=path / 'train.txt'),
    }

לגבי בוני מערכי נתונים סטנדרטיים, זה דורש להחליף את שיטות המחלקה _info ו _split_generators . בהתאם למערך הנתונים, ייתכן שיהיה עליך לעדכן גם את conll_dataset_builder_utils.py כדי לכלול את התכונות ואת רשימת התגים הספציפיים למערך הנתונים שלך.

שיטת _generate_examples לא צריכה לדרוש החלפה נוספת, אלא אם מערך הנתונים שלך זקוק ליישום ספציפי.

דוגמאות

שקול את conll2003 כדוגמה למערך נתונים המיושם באמצעות בונה הנתונים הספציפי ל-CoNLL.

CLI

הדרך הקלה ביותר לכתוב מערך נתונים חדש מבוסס CoNLL היא להשתמש ב- TFDS CLI :

cd path/to/my/project/datasets/
tfds new my_dataset --format=conll   # Create `my_dataset/my_dataset.py` CoNLL-specific template files

CoNLL-U

הפורמט

CoNLL-U הוא פורמט פופולרי המשמש לייצוג נתוני טקסט מוערים.

CoNLL-U משפר את פורמט CoNLL על ידי הוספת מספר תכונות, כגון תמיכה במילים מרובות אסימונים . נתונים בפורמט CoNLL-U מכילים בדרך כלל אסימון אחד עם ההערות הלשוניות שלו בכל שורה; בתוך אותה שורה, הערות מופרדות בדרך כלל על ידי תווי טאב בודד. קווים ריקים מייצגים גבולות משפטים.

בדרך כלל, כל שורת מילים מוערת ב-CoNLL-U מכילה את השדות הבאים, כפי שדווח בתיעוד הרשמי :

  • מזהה: אינדקס מילים, מספר שלם שמתחיל ב-1 עבור כל משפט חדש; עשוי להיות טווח עבור אסימונים מרובי מילים; יכול להיות מספר עשרוני עבור צמתים ריקים (מספרים עשרוניים יכולים להיות נמוכים מ-1 אך חייבים להיות גדולים מ-0).
  • צורה: צורת מילה או סמל פיסוק.
  • LEMMA: Lemma או גזע של צורת מילה.
  • UPOS: תג חלק-דיבור אוניברסלי.
  • XPOS: תג חלק-דיבור ספציפי לשפה; קו תחתון אם אינו זמין.
  • הישגים: רשימה של מאפיינים מורפולוגיים מתוך מלאי התכונות האוניברסליות או מהרחבה מוגדרת ספציפית לשפה; קו תחתון אם אינו זמין.
  • HEAD: ראש המילה הנוכחית, שהיא ערך של ID או אפס (0).
  • DEPREL: קשר תלות אוניברסלי ל-HEAD (שורש אם HEAD = 0) או תת-סוג מוגדר לשפה ספציפית של אחד.
  • DEPS: גרף תלות משופר בצורה של רשימה של זוגות ראש-דפרל.
  • MISC: כל הערה אחרת.

שקול כדוגמה את המשפט הבא עם הערות CoNLL-U מהתיעוד הרשמי :

1-2    vámonos   _
1      vamos     ir
2      nos       nosotros
3-4    al        _
3      a         a
4      el        el
5      mar       mar

ConllUDatasetBuilder

כדי להוסיף מערך נתונים חדש מבוסס CoNLL-U ל-TFDS, אתה יכול לבסס את מחלקת בונה הנתונים שלך על tfds.dataset_builders.ConllUDatasetBuilder . מחלקה בסיס זו מכילה קוד נפוץ להתמודדות עם הספציפיות של מערכי נתונים של CoNLL-U (חזרה על הפורמט המבוסס על העמודות, רשימות הידור מראש של תכונות ותגים, ...).

tfds.dataset_builders.ConllUDatasetBuilder מיישם GeneratorBasedBuilder ספציפי CoNLL-U. עיין במחלקה הבאה כדוגמה מינימלית של בונה נתונים של CoNLL-U:

from tensorflow_datasets.core.dataset_builders.conll import conllu_dataset_builder_utils as conllu_lib
import tensorflow_datasets.public_api as tfds

class MyCoNNLUDataset(tfds.dataset_builders.ConllUDatasetBuilder):
  VERSION = tfds.core.Version('1.0.0')
  RELEASE_NOTES = {'1.0.0': 'Initial release.'}

  # conllu_lib contains a set of ready-to-use features.
  BUILDER_CONFIGS = [
      conllu_lib.get_universal_morphology_config(
          language='en',
          features=conllu_lib.UNIVERSAL_DEPENDENCIES_FEATURES,
      )
  ]

  def _info(self) -> tfds.core.DatasetInfo:
    return self.create_dataset_info(
        # ...
    )

  def _split_generators(self, dl_manager):
    path = dl_manager.download_and_extract('https://data-url')

    return {
        'train':
            self._generate_examples(
                path=path / 'train.txt',
                # If necessary, add optional custom processing (see conllu_lib
                # for examples).
                # process_example_fn=...,
            )
    }

לגבי בוני מערכי נתונים סטנדרטיים, זה דורש להחליף את שיטות המחלקה _info ו _split_generators . בהתאם למערך הנתונים, ייתכן שיהיה עליך לעדכן גם את conllu_dataset_builder_utils.py כדי לכלול את התכונות ואת רשימת התגים הספציפיים למערך הנתונים שלך.

שיטת _generate_examples לא צריכה לדרוש החלפה נוספת, אלא אם מערך הנתונים שלך זקוק ליישום ספציפי. שים לב שאם מערך הנתונים שלך דורש עיבוד מקדים ספציפי - למשל אם הוא מחשיב תכונות תלות אוניברסליות לא קלאסיות - ייתכן שיהיה עליך לעדכן את התכונה process_example_fn של הפונקציה generate_examples שלך (ראה את xtreme_pos daset כדוגמה).

דוגמאות

שקול את מערכי הנתונים הבאים, המשתמשים בבונה הנתונים הספציפי של CoNNL-U, כדוגמאות:

CLI

הדרך הקלה ביותר לכתוב מערך נתונים חדש מבוסס CoNLL-U היא להשתמש ב- TFDS CLI :

cd path/to/my/project/datasets/
tfds new my_dataset --format=conllu   # Create `my_dataset/my_dataset.py` CoNLL-U specific template files