प्रारूप-विशिष्ट डेटासेट बिल्डर्स

यह मार्गदर्शिका वर्तमान में टीएफडीएस में उपलब्ध सभी प्रारूप-विशिष्ट डेटासेट बिल्डरों का दस्तावेजीकरण करती है।

प्रारूप-विशिष्ट डेटासेट बिल्डर्स tfds.core.GeneratorBasedBuilder के उपवर्ग हैं जो एक विशिष्ट डेटा प्रारूप के लिए अधिकांश डेटा प्रोसेसिंग का ख्याल रखते हैं।

tf.data.Dataset पर आधारित डेटासेट

यदि आप किसी ऐसे डेटासेट से टीएफडीएस डेटासेट बनाना चाहते हैं जो tf.data.Dataset ( संदर्भ ) प्रारूप में है, तो आप tfds.dataset_builders.TfDataBuilder ( एपीआई दस्तावेज़ देखें) का उपयोग कर सकते हैं।

हम इस वर्ग के दो विशिष्ट उपयोगों की कल्पना करते हैं:

  • नोटबुक जैसे वातावरण में प्रयोगात्मक डेटासेट बनाना
  • कोड में डेटासेट बिल्डर को परिभाषित करना

नोटबुक से एक नया डेटासेट बनाना

मान लीजिए कि आप एक नोटबुक में काम कर रहे हैं, कुछ डेटा को tf.data.Dataset के रूप में लोड किया है, विभिन्न परिवर्तन (मैप, फ़िल्टर, आदि) लागू किए हैं और अब आप इस डेटा को संग्रहीत करना चाहते हैं और इसे आसानी से टीम के साथियों के साथ साझा करना चाहते हैं या अन्य नोटबुक में लोड करना चाहते हैं। एक नए डेटासेट बिल्डर वर्ग को परिभाषित करने के बजाय, आप एक tfds.dataset_builders.TfDataBuilder को इंस्टेंट कर सकते हैं और अपने डेटासेट को TFDS डेटासेट के रूप में संग्रहीत करने के लिए download_and_prepare कॉल कर सकते हैं।

क्योंकि यह एक टीएफडीएस डेटासेट है, आप इसका संस्करण बना सकते हैं, कॉन्फ़िगरेशन का उपयोग कर सकते हैं, अलग-अलग विभाजन कर सकते हैं और बाद में आसान उपयोग के लिए इसका दस्तावेजीकरण कर सकते हैं। इसका मतलब है कि आपको टीएफडीएस को यह भी बताना होगा कि आपके डेटासेट में क्या विशेषताएं हैं।

आप इसका उपयोग कैसे कर सकते हैं इसका एक डमी उदाहरण यहां दिया गया है।

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 में संग्रहीत करेगी, जिसमें ट्रेन और परीक्षण विभाजन दोनों शामिल होंगे।

config तर्क वैकल्पिक है और यदि आप एक ही डेटासेट के अंतर्गत विभिन्न कॉन्फ़िगरेशन संग्रहीत करना चाहते हैं तो यह उपयोगी हो सकता है।

data_dir तर्क का उपयोग जेनरेट किए गए TFDS डेटासेट को एक अलग फ़ोल्डर में संग्रहीत करने के लिए किया जा सकता है, उदाहरण के लिए अपने स्वयं के सैंडबॉक्स में यदि आप इसे दूसरों के साथ (अभी तक) साझा नहीं करना चाहते हैं। ध्यान दें कि ऐसा करते समय, आपको data_dir tfds.load पर भी पास करना होगा। यदि data_dir तर्क निर्दिष्ट नहीं है, तो डिफ़ॉल्ट TFDS डेटा dir का उपयोग किया जाएगा।

आपका डेटासेट लोड हो रहा है

टीएफडीएस डेटासेट संग्रहीत होने के बाद, इसे अन्य स्क्रिप्ट से या टीम के साथियों द्वारा लोड किया जा सकता है यदि उनके पास डेटा तक पहुंच है:

# 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!",
        })

क्रोइसैंटबिल्डर

प्रारूप

क्रोइसैन 🥐 मशीन लर्निंग डेटासेट के लिए एक उच्च-स्तरीय प्रारूप है जो मेटाडेटा, संसाधन फ़ाइल विवरण, डेटा संरचना और डिफ़ॉल्ट एमएल शब्दार्थ को एक ही फ़ाइल में जोड़ता है; यह मौजूदा डेटासेट के साथ काम करता है ताकि उन्हें ढूंढना, उपयोग करना और टूल के साथ समर्थन करना आसान हो सके।

क्रोइसैंट schema.org और इसकी sc:Dataset शब्दावली पर आधारित है, जो वेब पर डेटासेट का प्रतिनिधित्व करने और उन्हें खोजने योग्य बनाने के लिए व्यापक रूप से उपयोग किया जाने वाला प्रारूप है।

CroissantBuilder

एक CroissantBuilder एक क्रोइसैन 🥐 मेटाडेटा फ़ाइल के आधार पर एक टीएफडीएस डेटासेट को परिभाषित करता है; निर्दिष्ट प्रत्येक record_set_ids का परिणाम एक अलग ConfigBuilder होगा।

उदाहरण के लिए, इसकी क्रोइसैन 🥐 परिभाषा का उपयोग करके एमएनआईएसटी डेटासेट के लिए एक CroissantBuilder आरंभ करने के लिए:

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 एक लोकप्रिय प्रारूप है जिसका उपयोग एनोटेटेड टेक्स्ट डेटा को प्रस्तुत करने के लिए किया जाता है।

सीओएनएलएल-स्वरूपित डेटा में आमतौर पर प्रति पंक्ति भाषाई एनोटेशन के साथ एक टोकन होता है; एक ही पंक्ति में, एनोटेशन आमतौर पर रिक्त स्थान या टैब द्वारा अलग किए जाते हैं। खाली पंक्तियाँ वाक्य की सीमाओं को दर्शाती हैं।

एक उदाहरण के रूप में 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

TFDS में एक नया CoNLL-आधारित डेटासेट जोड़ने के लिए, आप अपने डेटासेट बिल्डर क्लास को tfds.dataset_builders.ConllDatasetBuilder पर आधारित कर सकते हैं। इस बेस क्लास में CoNLL डेटासेट की विशिष्टताओं से निपटने के लिए सामान्य कोड शामिल है (कॉलम-आधारित प्रारूप पर पुनरावृत्ति, सुविधाओं और टैग की पूर्व-संकलित सूचियां, ...)।

tfds.dataset_builders.ConllDatasetBuilder एक CoNLL-विशिष्ट GeneratorBasedBuilder लागू करता है। 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 विधि को और अधिक ओवरराइटिंग की आवश्यकता नहीं होनी चाहिए, जब तक कि आपके डेटासेट को विशिष्ट कार्यान्वयन की आवश्यकता न हो।

उदाहरण

CoNLL-विशिष्ट डेटासेट बिल्डर का उपयोग करके कार्यान्वित डेटासेट के उदाहरण के रूप में conll2003 पर विचार करें।

सीएलआई

नया 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 प्रारूप को बढ़ाता है, जैसे मल्टी-टोकन शब्दों के लिए समर्थन। CoNLL-U स्वरूपित डेटा में आमतौर पर प्रति पंक्ति भाषाई एनोटेशन के साथ एक टोकन होता है; एक ही पंक्ति में, एनोटेशन आमतौर पर एकल टैब वर्णों द्वारा अलग किए जाते हैं। खाली पंक्तियाँ वाक्य की सीमाओं को दर्शाती हैं।

आमतौर पर, प्रत्येक CoNLL-U एनोटेटेड शब्द पंक्ति में निम्नलिखित फ़ील्ड होते हैं, जैसा कि आधिकारिक दस्तावेज़ में बताया गया है:

  • आईडी: शब्द सूचकांक, प्रत्येक नए वाक्य के लिए 1 से शुरू होने वाला पूर्णांक; मल्टीवर्ड टोकन के लिए एक सीमा हो सकती है; खाली नोड्स के लिए दशमलव संख्या हो सकती है (दशमलव संख्या 1 से कम हो सकती है लेकिन 0 से अधिक होनी चाहिए)।
  • रूप: शब्द रूप या विराम चिह्न।
  • लेम्मा: लेम्मा या शब्द रूप का तना।
  • यूपीओएस: यूनिवर्सल पार्ट-ऑफ़-स्पीच टैग।
  • XPOS: भाषा-विशिष्ट भाग-ऑफ़-स्पीच टैग; यदि उपलब्ध न हो तो अंडरस्कोर करें।
  • विशेषताएँ: सार्वभौमिक सुविधा सूची से या परिभाषित भाषा-विशिष्ट विस्तार से रूपात्मक विशेषताओं की सूची; यदि उपलब्ध न हो तो अंडरस्कोर करें।
  • शीर्ष: वर्तमान शब्द का शीर्ष, जो या तो आईडी या शून्य (0) का मान है।
  • DEPREL: HEAD से सार्वभौमिक निर्भरता संबंध (रूट iff HEAD = 0) या एक परिभाषित भाषा-विशिष्ट उपप्रकार।
  • डीईपीएस: हेड-डिप्रेल जोड़ियों की सूची के रूप में उन्नत निर्भरता ग्राफ।
  • 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

TFDS में एक नया CoNLL-U आधारित डेटासेट जोड़ने के लिए, आप अपने डेटासेट बिल्डर क्लास को tfds.dataset_builders.ConllUDatasetBuilder पर आधारित कर सकते हैं। इस बेस क्लास में CoNLL-U डेटासेट की विशिष्टताओं से निपटने के लिए सामान्य कोड शामिल है (कॉलम-आधारित प्रारूप पर पुनरावृत्ति, सुविधाओं और टैग की पूर्व-संकलित सूचियां, ...)।

tfds.dataset_builders.ConllUDatasetBuilder एक CoNLL-U विशिष्ट GeneratorBasedBuilder लागू करता है। 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 विधि को और अधिक ओवरराइटिंग की आवश्यकता नहीं होनी चाहिए, जब तक कि आपके डेटासेट को विशिष्ट कार्यान्वयन की आवश्यकता न हो। ध्यान दें, यदि आपके डेटासेट को विशिष्ट प्रीप्रोसेसिंग की आवश्यकता है - उदाहरण के लिए यदि यह गैर-क्लासिक सार्वभौमिक निर्भरता सुविधाओं पर विचार करता है - तो आपको अपने generate_examples फ़ंक्शन की process_example_fn विशेषता को अपडेट करने की आवश्यकता हो सकती है (उदाहरण के रूप में xtreme_pos daset देखें)।

उदाहरण

उदाहरण के तौर पर निम्नलिखित डेटासेट पर विचार करें, जो CoNNL-U विशिष्ट डेटासेट बिल्डर का उपयोग करते हैं:

सीएलआई

नया 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