Trình tạo tập dữ liệu dành riêng cho định dạng

Hướng dẫn này ghi lại tất cả các trình tạo tập dữ liệu theo định dạng cụ thể hiện có trong TFDS.

Trình tạo tập dữ liệu dành riêng cho định dạng là các lớp con của tfds.core.GeneratorBasedBuilder đảm nhiệm hầu hết việc xử lý dữ liệu cho một định dạng dữ liệu cụ thể.

Bộ dữ liệu dựa trên tf.data.Dataset

Nếu bạn muốn tạo tập dữ liệu TFDS từ tập dữ liệu có định dạng tf.data.Dataset ( tham chiếu ), thì bạn có thể sử dụng tfds.dataset_builders.TfDataBuilder (xem tài liệu API ).

Chúng tôi hình dung hai cách sử dụng điển hình của lớp này:

  • Tạo bộ dữ liệu thử nghiệm trong môi trường giống như sổ ghi chép
  • Xác định trình tạo tập dữ liệu trong mã

Tạo tập dữ liệu mới từ sổ ghi chép

Giả sử bạn đang làm việc trong một sổ ghi chép, tải một số dữ liệu dưới dạng tf.data.Dataset , áp dụng nhiều phép biến đổi khác nhau (bản đồ, bộ lọc, v.v.) và bây giờ bạn muốn lưu trữ dữ liệu này và dễ dàng chia sẻ nó với đồng đội hoặc tải nó vào các sổ ghi chép khác. Thay vì phải xác định lớp trình tạo tập dữ liệu mới, bạn cũng có thể khởi tạo một tfds.dataset_builders.TfDataBuilder và gọi download_and_prepare để lưu trữ tập dữ liệu của mình dưới dạng tập dữ liệu TFDS.

Vì đây là tập dữ liệu TFDS nên bạn có thể tạo phiên bản, sử dụng cấu hình, có các phần phân tách khác nhau và ghi lại để sử dụng dễ dàng hơn sau này. Điều này có nghĩa là bạn cũng phải cho TFDS biết các tính năng trong tập dữ liệu của bạn.

Đây là một ví dụ giả về cách bạn có thể sử dụng nó.

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

Phương thức download_and_prepare sẽ lặp lại tf.data.Dataset s đầu vào và lưu trữ tập dữ liệu TFDS tương ứng trong /my/folder/my_dataset/single_number/1.0.0 , sẽ chứa cả phần tách tàu và phần kiểm tra.

Đối số config là tùy chọn và có thể hữu ích nếu bạn muốn lưu trữ các cấu hình khác nhau trong cùng một tập dữ liệu.

Đối số data_dir có thể được sử dụng để lưu trữ tập dữ liệu TFDS đã tạo trong một thư mục khác, ví dụ như trong hộp cát của riêng bạn nếu bạn chưa muốn chia sẻ tập dữ liệu này với người khác. Lưu ý rằng khi thực hiện việc này, bạn cũng cần chuyển data_dir cho tfds.load . Nếu đối số data_dir không được chỉ định thì thư mục dữ liệu TFDS mặc định sẽ được sử dụng.

Đang tải tập dữ liệu của bạn

Sau khi tập dữ liệu TFDS được lưu trữ, nó có thể được tải từ các tập lệnh khác hoặc bởi đồng đội nếu họ có quyền truy cập vào dữ liệu:

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

Thêm phiên bản hoặc cấu hình mới

Sau khi lặp lại thêm trên tập dữ liệu của mình, bạn có thể đã thêm hoặc thay đổi một số chuyển đổi của dữ liệu nguồn. Để lưu trữ và chia sẻ tập dữ liệu này, bạn có thể dễ dàng lưu trữ tập dữ liệu này dưới dạng phiên bản mới.

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

Xác định lớp xây dựng tập dữ liệu mới

Bạn cũng có thể xác định DatasetBuilder mới dựa trên lớp này.

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

Định dạng

Croissant 🥐 là định dạng cấp cao dành cho bộ dữ liệu máy học kết hợp siêu dữ liệu, mô tả tệp tài nguyên, cấu trúc dữ liệu và ngữ nghĩa ML mặc định vào một tệp duy nhất; nó hoạt động với các tập dữ liệu hiện có để giúp chúng dễ dàng tìm thấy, sử dụng và hỗ trợ hơn bằng các công cụ.

Croissant xây dựng trên Schema.org và từ vựng sc:Dataset của nó, một định dạng được sử dụng rộng rãi để thể hiện các tập dữ liệu trên Web và làm cho chúng có thể tìm kiếm được.

CroissantBuilder

CroissantBuilder xác định tập dữ liệu TFDS dựa trên tệp siêu dữ liệu Croissant 🥐; mỗi record_set_ids được chỉ định sẽ tạo ra một ConfigBuilder riêng biệt.

Ví dụ: để khởi tạo CroissantBuilder cho tập dữ liệu MNIST bằng định nghĩa Croissant 🥐 của nó:

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

Định dạng

CoNLL là một định dạng phổ biến được sử dụng để thể hiện dữ liệu văn bản có chú thích.

Dữ liệu được định dạng CoNLL thường chứa một mã thông báo với các chú thích ngôn ngữ trên mỗi dòng; trong cùng một dòng, các chú thích thường được phân tách bằng dấu cách hoặc tab. Các dòng trống thể hiện ranh giới câu.

Hãy xem xét ví dụ về câu sau từ tập dữ liệu conll2003 , tuân theo định dạng chú thích 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

Để thêm tập dữ liệu dựa trên CoNLL mới vào TFDS, bạn có thể tạo lớp xây dựng tập dữ liệu của mình dựa trên tfds.dataset_builders.ConllDatasetBuilder . Lớp cơ sở này chứa mã chung để giải quyết các đặc thù của bộ dữ liệu CoNLL (lặp lại theo định dạng dựa trên cột, danh sách các tính năng và thẻ được biên dịch trước, ...).

tfds.dataset_builders.ConllDatasetBuilder triển khai GeneratorBasedBuilder dành riêng cho CoNLL. Hãy tham khảo lớp sau đây như một ví dụ tối thiểu về trình tạo tập dữ liệu 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'),
    }

Đối với các trình tạo tập dữ liệu tiêu chuẩn, nó yêu cầu ghi đè các phương thức lớp _info_split_generators . Tùy thuộc vào tập dữ liệu, bạn cũng có thể cần cập nhật conll_dataset_builder_utils.py để bao gồm các tính năng và danh sách thẻ dành riêng cho tập dữ liệu của mình.

Phương thức _generate_examples không yêu cầu ghi đè thêm, trừ khi tập dữ liệu của bạn cần triển khai cụ thể.

Ví dụ

Hãy xem conll2003 làm ví dụ về tập dữ liệu được triển khai bằng cách sử dụng trình tạo tập dữ liệu dành riêng cho CoNLL.

CLI

Cách dễ nhất để viết tập dữ liệu dựa trên CoNLL mới là sử dụng 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

Định dạng

CoNLL-U là định dạng phổ biến được sử dụng để thể hiện dữ liệu văn bản có chú thích.

CoNLL-U nâng cao định dạng CoNLL bằng cách thêm một số tính năng, chẳng hạn như hỗ trợ các từ có nhiều mã thông báo . Dữ liệu được định dạng CoNLL-U thường chứa một mã thông báo với các chú thích ngôn ngữ trên mỗi dòng; trong cùng một dòng, các chú thích thường được phân tách bằng các ký tự tab đơn. Các dòng trống thể hiện ranh giới câu.

Thông thường, mỗi dòng từ được chú thích CoNLL-U chứa các trường sau, như được báo cáo trong tài liệu chính thức :

  • ID: Chỉ số từ, số nguyên bắt đầu từ 1 cho mỗi câu mới; có thể là một phạm vi cho các mã thông báo nhiều từ; có thể là số thập phân đối với các nút trống (số thập phân có thể nhỏ hơn 1 nhưng phải lớn hơn 0).
  • HÌNH THỨC: Dạng từ hoặc ký hiệu dấu chấm câu.
  • LEMMA: Bổ đề hoặc gốc của dạng từ.
  • UPOS: Thẻ phần lời nói phổ quát.
  • XPOS: Thẻ phần lời nói dành riêng cho ngôn ngữ; gạch dưới nếu không có sẵn.
  • TÍNH NĂNG: Danh sách các đặc điểm hình thái từ kho tính năng phổ quát hoặc từ một phần mở rộng dành riêng cho ngôn ngữ đã xác định; gạch dưới nếu không có sẵn.
  • HEAD: Phần đầu của từ hiện tại, có giá trị là ID hoặc 0 (0).
  • DEPREL: Mối quan hệ phụ thuộc phổ biến với HEAD (gốc iff HEAD = 0) hoặc một kiểu con dành riêng cho ngôn ngữ được xác định của một.
  • DEPS: Biểu đồ phụ thuộc nâng cao dưới dạng danh sách các cặp head-deprel.
  • MISC: Bất kỳ chú thích nào khác.

Hãy xem xét ví dụ về câu được chú thích CoNLL-U sau đây từ tài liệu chính thức :

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

ConllUDatasetBuilder

Để thêm tập dữ liệu dựa trên CoNLL-U mới vào TFDS, bạn có thể tạo lớp xây dựng tập dữ liệu của mình dựa trên tfds.dataset_builders.ConllUDatasetBuilder . Lớp cơ sở này chứa mã chung để giải quyết các đặc thù của bộ dữ liệu CoNLL-U (lặp lại theo định dạng dựa trên cột, danh sách các tính năng và thẻ được biên dịch trước, ...).

tfds.dataset_builders.ConllUDatasetBuilder triển khai GeneratorBasedBuilder cụ thể của CoNLL-U. Hãy tham khảo lớp sau đây như một ví dụ tối thiểu về trình tạo tập dữ liệ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=...,
            )
    }

Đối với các trình tạo tập dữ liệu tiêu chuẩn, nó yêu cầu ghi đè các phương thức lớp _info_split_generators . Tùy thuộc vào tập dữ liệu, bạn cũng có thể cần cập nhật conllu_dataset_builder_utils.py để bao gồm các tính năng và danh sách thẻ dành riêng cho tập dữ liệu của mình.

Phương thức _generate_examples không yêu cầu ghi đè thêm, trừ khi tập dữ liệu của bạn cần triển khai cụ thể. Lưu ý rằng, nếu tập dữ liệu của bạn yêu cầu xử lý trước cụ thể - ví dụ: nếu nó xem xét các tính năng phụ thuộc phổ quát không cổ điển - thì bạn có thể cần phải cập nhật thuộc tính process_example_fn của hàm generate_examples (xem daset xtreme_pos làm ví dụ).

Ví dụ

Hãy xem xét các tập dữ liệu sau, sử dụng trình tạo tập dữ liệu cụ thể CoNNL-U, làm ví dụ:

CLI

Cách dễ nhất để viết tập dữ liệu dựa trên CoNLL-U mới là sử dụng 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