ตัวสร้างชุดข้อมูลเฉพาะรูปแบบ

คู่มือนี้จัดทำเอกสารเกี่ยวกับตัวสร้างชุดข้อมูลเฉพาะรูปแบบทั้งหมดที่มีอยู่ใน TFDS ในปัจจุบัน

ตัวสร้างชุดข้อมูลเฉพาะรูปแบบคือคลาสย่อยของ tfds.core.GeneratorBasedBuilder ซึ่งดูแลการประมวลผลข้อมูลส่วนใหญ่สำหรับรูปแบบข้อมูลเฉพาะ

ชุดข้อมูลที่อิงตาม tf.data.Dataset

หากคุณต้องการสร้างชุดข้อมูล TFDS จากชุดข้อมูลที่อยู่ในรูปแบบ tf.data.Dataset ( อ้างอิง ) คุณสามารถใช้ 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 ซึ่งจะมีทั้งการแยกรถไฟและการทดสอบ

อาร์กิวเมนต์ config เป็นทางเลือกและมีประโยชน์หากคุณต้องการจัดเก็บการกำหนดค่าที่แตกต่างกันภายใต้ชุดข้อมูลเดียวกัน

อาร์กิวเมนต์ data_dir สามารถใช้เพื่อจัดเก็บชุดข้อมูล TFDS ที่สร้างขึ้นในโฟลเดอร์อื่น เช่น ในแซนด์บ็อกซ์ของคุณเอง หากคุณไม่ต้องการแชร์สิ่งนี้กับผู้อื่น (ยัง) โปรดทราบว่าเมื่อทำเช่นนี้ คุณจะต้องส่ง data_dir ไปที่ tfds.load ด้วย หากไม่ได้ระบุอาร์กิวเมนต์ data_dir ดังนั้นข้อมูล dir ของ TFDS เริ่มต้นจะถูกนำมาใช้

กำลังโหลดชุดข้อมูลของคุณ

หลังจากจัดเก็บชุดข้อมูล 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!",
        })

ครัวซองต์Builder

รูปแบบ

Croissant 🥐 เป็นรูปแบบระดับสูงสำหรับชุดข้อมูลการเรียนรู้ของเครื่องที่รวมข้อมูลเมตา คำอธิบายไฟล์ทรัพยากร โครงสร้างข้อมูล และความหมาย ML เริ่มต้นไว้ในไฟล์เดียว โดยทำงานร่วมกับชุดข้อมูลที่มีอยู่เพื่อให้ค้นหา ใช้งาน และสนับสนุนด้วยเครื่องมือได้ง่ายขึ้น

ครัวซองต์สร้างขึ้นบน 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

คลีไอ

วิธีที่ง่ายที่สุดในการเขียนชุดข้อมูลที่ใช้ 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 จะมีฟิลด์ต่อไปนี้ ตามที่รายงานใน เอกสารอย่างเป็นทางการ :

  • ID: ดัชนีคำ จำนวนเต็มเริ่มต้นที่ 1 สำหรับแต่ละประโยคใหม่ อาจเป็นช่วงสำหรับโทเค็นหลายคำ อาจเป็นเลขฐานสิบสำหรับโหนดว่าง (เลขฐานสิบสามารถต่ำกว่า 1 แต่ต้องมากกว่า 0)
  • FORM: รูปแบบคำหรือสัญลักษณ์เครื่องหมายวรรคตอน
  • LEMMA: บทแทรกหรือก้านของรูปแบบคำ
  • UPOS: แท็กส่วนหนึ่งของคำพูดสากล
  • XPOS: แท็กส่วนของคำพูดเฉพาะภาษา ขีดเส้นใต้หากไม่มี
  • FEATS: รายการคุณสมบัติทางสัณฐานวิทยาจากรายการคุณสมบัติสากลหรือจากส่วนขยายเฉพาะภาษาที่กำหนด ขีดเส้นใต้หากไม่มี
  • HEAD: ส่วนหัวของคำปัจจุบัน ซึ่งเป็นค่า ID หรือศูนย์ (0)
  • DEPREL: ความสัมพันธ์การพึ่งพาสากลกับ HEAD (root iff HEAD = 0) หรือประเภทย่อยเฉพาะภาษาที่กำหนดของประเภทหนึ่ง
  • DEPS: กราฟการพึ่งพาที่ได้รับการปรับปรุงในรูปแบบของรายการคู่ head-deprel
  • 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 เป็นตัวอย่าง)

ตัวอย่าง

พิจารณาชุดข้อมูลต่อไปนี้ ซึ่งใช้ตัวสร้างชุดข้อมูลเฉพาะ ConNNL-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