Formata Özel Veri Kümesi Oluşturucuları

Bu kılavuz, şu anda TFDS'de mevcut olan tüm formata özel veri kümesi oluşturucularını belgelemektedir.

Formata özgü veri kümesi oluşturucuları, belirli bir veri formatı için çoğu veri işlemeyi üstlenen tfds.core.GeneratorBasedBuilder alt sınıflarıdır.

tf.data.Dataset temel alan veri kümeleri

tf.data.Dataset ( referans ) biçimindeki bir veri kümesinden TFDS veri kümesi oluşturmak istiyorsanız tfds.dataset_builders.TfDataBuilder kullanabilirsiniz ( API belgelerine bakın).

Bu sınıfın iki tipik kullanımını öngörüyoruz:

  • Dizüstü bilgisayar benzeri bir ortamda deneysel veri kümeleri oluşturma
  • Kodda veri kümesi oluşturucuyu tanımlama

Not defterinden yeni bir veri kümesi oluşturma

Diyelim ki bir not defterinde çalışıyorsunuz, bazı verileri tf.data.Dataset olarak yüklediniz, çeşitli dönüşümler (harita, filtre vb) uyguladınız ve artık bu verileri saklayıp ekip arkadaşlarınızla kolayca paylaşmak veya başka not defterlerine yüklemek istiyorsunuz. Yeni bir veri kümesi oluşturucu sınıfı tanımlamak zorunda kalmak yerine, bir tfds.dataset_builders.TfDataBuilder örneğini oluşturabilir ve veri kümenizi bir TFDS veri kümesi olarak depolamak için download_and_prepare öğesini çağırabilirsiniz.

Bu bir TFDS veri kümesi olduğundan onu sürümlendirebilir, yapılandırmaları kullanabilir, farklı bölmelere sahip olabilir ve daha sonra daha kolay kullanmak üzere belgeleyebilirsiniz. Bu, veri kümenizdeki özelliklerin neler olduğunu TFDS'ye de söylemeniz gerektiği anlamına gelir.

İşte bunu nasıl kullanabileceğinize dair kukla bir örnek.

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 yöntemi, tf.data.Dataset s girişi üzerinde yinelenecek ve karşılık gelen TFDS veri kümesini, hem eğitim hem de test bölümlerini içerecek olan /my/folder/my_dataset/single_number/1.0.0 içinde depolayacaktır.

config bağımsız değişkeni isteğe bağlıdır ve farklı yapılandırmaları aynı veri kümesi altında depolamak istiyorsanız yararlı olabilir.

data_dir argümanı, oluşturulan TFDS veri kümesini farklı bir klasörde, örneğin bunu başkalarıyla (henüz) paylaşmak istemiyorsanız kendi sanal alanınızda depolamak için kullanılabilir. Bunu yaparken data_dir tfds.load dosyasına da iletmeniz gerektiğini unutmayın. data_dir argümanı belirtilmezse, varsayılan TFDS veri dizini kullanılacaktır.

Veri kümeniz yükleniyor

TFDS veri kümesi depolandıktan sonra, diğer komut dosyalarından veya verilere erişimleri varsa ekip arkadaşları tarafından yüklenebilir:

# 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)

Yeni bir sürüm veya yapılandırma ekleme

Veri kümenizde daha fazla yineleme yaptıktan sonra, kaynak verilerdeki bazı dönüşümleri eklemiş veya değiştirmiş olabilirsiniz. Bu veri kümesini saklamak ve paylaşmak için bunu kolayca yeni bir sürüm olarak saklayabilirsiniz.

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()

Yeni bir veri kümesi oluşturucu sınıfı tanımlama

Bu sınıfa dayalı olarak yeni bir DatasetBuilder da tanımlayabilirsiniz.

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

Kruvasan Oluşturucu

Biçim

Croissant 🥐, meta verileri, kaynak dosya açıklamalarını, veri yapısını ve varsayılan ML semantiğini tek bir dosyada birleştiren, makine öğrenimi veri kümeleri için üst düzey bir formattır; bulmayı, kullanmayı ve araçlarla desteklemeyi kolaylaştırmak için mevcut veri kümeleriyle birlikte çalışır.

Croissant, Web'deki veri kümelerini temsil etmek ve onları aranabilir kılmak için yaygın olarak kullanılan bir format olan schema.org'u ve onun sc:Dataset kelime dağarcığını temel alır.

CroissantBuilder

CroissantBuilder Croissant 🥐 meta veri dosyasını temel alan bir TFDS veri kümesini tanımlar; Belirtilen record_set_ids her biri ayrı bir ConfigBuilder ile sonuçlanacaktır.

Örneğin, MNIST veri kümesi için Croissant 🥐 tanımını kullanarak bir CroissantBuilder başlatmak için:

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])

KONLL

Biçim

CoNLL, açıklamalı metin verilerini temsil etmek için kullanılan popüler bir formattır.

CoNLL formatlı veriler genellikle her satırda dilsel açıklamalarla birlikte bir belirteç içerir; aynı satırda ek açıklamalar genellikle boşluklarla veya sekmelerle ayrılır. Boş satırlar cümle sınırlarını temsil eder.

Örnek olarak conll2003 veri kümesinden alınan ve CoNLL ek açıklama formatını izleyen aşağıdaki cümleyi düşünün:

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'ye yeni bir CoNLL tabanlı veri kümesi eklemek için veri kümesi oluşturucu sınıfınızı tfds.dataset_builders.ConllDatasetBuilder dayandırabilirsiniz. Bu temel sınıf, CoNLL veri kümelerinin özellikleriyle başa çıkmak için ortak kod içerir (sütun tabanlı format üzerinde yineleme, önceden derlenmiş özellik ve etiket listeleri, ...).

tfds.dataset_builders.ConllDatasetBuilder CoNLL'ye özgü bir GeneratorBasedBuilder uygular. CoNLL veri kümesi oluşturucusunun minimum örneği olarak aşağıdaki sınıfa bakın:

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'),
    }

Standart veri kümesi oluşturucularına gelince, _info ve _split_generators sınıf yöntemlerinin üzerine yazılmasını gerektirir. Veri kümesine bağlı olarak, veri kümenize özgü özellikleri ve etiket listesini eklemek için conll_dataset_builder_utils.py dosyasını da güncellemeniz gerekebilir.

Veri kümeniz özel bir uygulamaya ihtiyaç duymadığı sürece _generate_examples yönteminin daha fazla üzerine yazılmasını gerektirmemesi gerekir.

Örnekler

Conll2003'ü, CoNLL'ye özgü veri kümesi oluşturucusu kullanılarak uygulanan bir veri kümesi örneği olarak düşünün.

CLI

Yeni bir CoNLL tabanlı veri kümesi yazmanın en kolay yolu TFDS CLI'yi kullanmaktır:

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

CoNLL-U

Biçim

CoNLL-U, açıklamalı metin verilerini temsil etmek için kullanılan popüler bir formattır.

CoNLL-U , çoklu belirteçli kelimelerin desteklenmesi gibi bir dizi özellik ekleyerek CoNLL formatını geliştirir. CoNLL-U formatlı veriler genellikle her satırda dilsel açıklamalarla birlikte bir belirteç içerir; aynı satırdaki ek açıklamalar genellikle tek sekme karakterleriyle ayrılır. Boş satırlar cümle sınırlarını temsil eder.

Tipik olarak, her CoNLL-U açıklamalı kelime satırı, resmi belgelerde bildirildiği gibi aşağıdaki alanları içerir:

  • ID: Kelime dizini, her yeni cümle için 1'den başlayan tamsayı; çok kelimeli belirteçler için bir aralık olabilir; boş düğümler için ondalık sayı olabilir (ondalık sayılar 1'den küçük olabilir ancak 0'dan büyük olmalıdır).
  • FORM: Kelime formu veya noktalama işareti sembolü.
  • LEMMA: Lemma veya kelime biçiminin kökü.
  • UPOS: Evrensel konuşma parçası etiketi.
  • XPOS: Dile özgü konuşma bölümü etiketi; mevcut değilse alt çizgi.
  • ÖZELLİKLER: Evrensel özellik envanterinden veya tanımlanmış bir dile özgü uzantıdan morfolojik özelliklerin listesi; mevcut değilse alt çizgi.
  • HEAD: ID veya sıfır (0) değeri olan geçerli kelimenin başı.
  • DEPREL: HEAD'e (kök iff HEAD = 0) veya tanımlanmış dile özgü bir alt türe evrensel bağımlılık ilişkisi.
  • DEPS: Kafa-deprel çiftlerinin listesi biçiminde geliştirilmiş bağımlılık grafiği.
  • MISC: Başka herhangi bir açıklama.

Örnek olarak resmi belgelerden alınan aşağıdaki CoNLL-U açıklamalı cümlesini düşünün:

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

ConllUDatasetBuilder

TFDS'ye yeni bir CoNLL-U tabanlı veri kümesi eklemek için veri kümesi oluşturucu sınıfınızı tfds.dataset_builders.ConllUDatasetBuilder dayandırabilirsiniz. Bu temel sınıf, CoNLL-U veri kümelerinin özellikleriyle başa çıkmak için ortak kod içerir (sütun tabanlı format üzerinde yineleme, önceden derlenmiş özellik ve etiket listeleri, ...).

tfds.dataset_builders.ConllUDatasetBuilder CoNLL-U'ya özgü bir GeneratorBasedBuilder uygular. CoNLL-U veri kümesi oluşturucusunun minimum örneği olarak aşağıdaki sınıfa bakın:

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=...,
            )
    }

Standart veri kümesi oluşturucularına gelince, _info ve _split_generators sınıf yöntemlerinin üzerine yazılmasını gerektirir. Veri kümesine bağlı olarak, veri kümenize özgü özellikleri ve etiket listesini eklemek için conllu_dataset_builder_utils.py dosyasını da güncellemeniz gerekebilir.

Veri kümeniz özel bir uygulamaya ihtiyaç duymadığı sürece _generate_examples yönteminin daha fazla üzerine yazılmasını gerektirmemesi gerekir. Veri kümeniz belirli bir ön işleme gerektiriyorsa (örneğin, klasik olmayan evrensel bağımlılık özelliklerini dikkate alıyorsa), generate_examples işlevinizin process_example_fn niteliğini güncellemeniz gerekebileceğini unutmayın (örnek olarak xtreme_pos veri kümesine bakın).

Örnekler

Örnek olarak CoNNL-U'ya özgü veri kümesi oluşturucusunu kullanan aşağıdaki veri kümelerini göz önünde bulundurun:

CLI

Yeni bir CoNLL-U tabanlı veri kümesi yazmanın en kolay yolu TFDS CLI'yi kullanmaktır:

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