커스텀 데이터 세트 작성

이 가이드에 따라 새 데이터 세트를 생성하십시오(TFDS 또는 자체 리포지토리에서).

우리의 확인 데이터 세트의 목록을 원하는 데이터 세트가 이미 존재하는지 확인합니다.

TL;DR

새로운 데이터 세트를 작성하는 가장 쉬운 방법은 사용하는 것입니다 TFDS CLI를 :

cd path/to/my/project/datasets/
tfds new my_dataset  # Create `my_dataset/my_dataset.py` template files
# [...] Manually modify `my_dataset/my_dataset.py` to implement your dataset.
cd my_dataset/
tfds build  # Download and prepare the dataset to `~/tensorflow_datasets/`

와 새로운 데이터 세트를 사용하려면 tfds.load('my_dataset') :

  • tfds.load 자동으로 검색에서 생성 된 데이터 세트로드합니다 ~/tensorflow_datasets/my_dataset/ (예에 의한 tfds build ).
  • 양자 택일로, 당신은 명시 적으로 할 수 import my.project.datasets.my_dataset 데이터 집합을 등록 :
import my.project.datasets.my_dataset  # Register `my_dataset`

ds = tfds.load('my_dataset')  # `my_dataset` registered

개요

데이터 세트는 모든 종류의 형식과 모든 장소에 배포되며 머신 러닝 파이프라인에 공급할 준비가 된 형식으로 항상 저장되지는 ​​않습니다. TFDS를 입력합니다.

다음 기계 학습 파이프 라인으로로드 할 수 있습니다 (직렬화 파일 -> - TFDS는 표준 형식으로 그 데이터 세트 (> 연재 파일 외부 데이터) 처리 tf.data.Dataset ). 직렬화는 한 번만 수행됩니다. 후속 액세스는 사전 처리된 파일에서 직접 읽습니다.

대부분의 전처리는 자동으로 수행됩니다. 각 데이터 세트의 구현의 서브 클래스 tfds.core.DatasetBuilder , 지정합니다 :

  • 데이터의 출처(예: URL)
  • 데이터 세트의 모양(즉, 기능)
  • 데이터 분할 (예를 들면 어떻게해야 TRAINTEST );
  • 데이터 세트의 개별 예.

데이터세트 작성

기본 템플릿 : tfds new

사용 TFDS CLI는 필요한 템플릿 파이썬 파일을 생성합니다.

cd path/to/project/datasets/  # Or use `--dir=path/to/project/datasets/` below
tfds new my_dataset

이 명령은 새로운 생성 my_dataset/ 다음과 같은 구조의 폴더를 :

my_dataset/
    __init__.py
    my_dataset.py # Dataset definition
    my_dataset_test.py # (optional) Test
    dummy_data/ # (optional) Fake data (used for testing)
    checksum.tsv # (optional) URL checksums (see `checksums` section).

검색 TODO(my_dataset) 여기에 따라 수정합니다.

데이터세트 예시

모든 데이터 세트로 구현 tfds.core.GeneratorBasedBuilder 의 서브 클래스 tfds.core.DatasetBuilder 대부분의 보일러을 담당한다. 다음을 지원합니다.

다음은 데이터 세트 클래스의 최소 예입니다.

class MyDataset(tfds.core.GeneratorBasedBuilder):
  """DatasetBuilder for my_dataset dataset."""

  VERSION = tfds.core.Version('1.0.0')
  RELEASE_NOTES = {
      '1.0.0': 'Initial release.',
  }

  def _info(self) -> tfds.core.DatasetInfo:
    """Dataset metadata (homepage, citation,...)."""
    return tfds.core.DatasetInfo(
        builder=self,
        features=tfds.features.FeaturesDict({
            'image': tfds.features.Image(shape=(256, 256, 3)),
            'label': tfds.features.ClassLabel(names=['no', 'yes']),
        }),
    )

  def _split_generators(self, dl_manager: tfds.download.DownloadManager):
    """Download the data and define splits."""
    extracted_path = dl_manager.download_and_extract('http://data.org/data.zip')
    # dl_manager returns pathlib-like objects with `path.read_text()`,
    # `path.iterdir()`,...
    return {
        'train': self._generate_examples(path=extracted_path / 'train_images'),
        'test': self._generate_examples(path=extracted_path / 'test_images'),
    }

  def _generate_examples(self, path) -> Iterator[Tuple[Key, Example]]:
    """Generator of examples for each split."""
    for img_path in path.glob('*.jpeg'):
      # Yields (key, example)
      yield img_path.name, {
          'image': img_path,
          'label': 'yes' if img_path.name.startswith('yes_') else 'no',
      }

덮어쓰는 3가지 추상 메소드에 대해 자세히 알아보자.

_info : 데이터 세트 메타 데이터

_info 반환 tfds.core.DatasetInfo 포함하는 데이터 세트의 메타 데이터를 .

def _info(self):
  return tfds.core.DatasetInfo(
      builder=self,
      # Description and homepage used for documentation
      description="""
      Markdown description of the dataset. The text will be automatically
      stripped and dedent.
      """,
      homepage='https://dataset-homepage.org',
      features=tfds.features.FeaturesDict({
          'image_description': tfds.features.Text(),
          'image': tfds.features.Image(),
          # Here, 'label' can be 0-4.
          'label': tfds.features.ClassLabel(num_classes=5),
      }),
      # If there's a common `(input, target)` tuple from the features,
      # specify them here. They'll be used if as_supervised=True in
      # builder.as_dataset.
      supervised_keys=('image', 'label'),
      # Specify whether to disable shuffling on the examples. Set to False by default.
      disable_shuffling=False,
      # Bibtex citation for the dataset
      citation=r"""
      @article{my-awesome-dataset-2020,
               author = {Smith, John},}
      """,
  )

대부분의 필드는 자명해야 합니다. 일부 정밀도:

  • features :이 ... 데이터 세트의 구조, 모양을 지정하는 복잡한 데이터 유형 (오디오, 비디오, 중첩 된 시퀀스를, ...) 지원합니다. 참고 항목 사용할 수있는 기능 또는 기능 커넥터 가이드 대한 추가 정보를 원하시면 있습니다.
  • disable_shuffling : 참조 섹션은 데이터 세트 순서를 유지한다 .
  • citation 다음 찾으려면 BibText 인용을 :
    • 인용 지침을 위해 데이터세트 웹사이트를 검색합니다(BibTex 형식으로 사용).
    • 들어 arXiv에 논문 : 용지를 찾아 클릭 BibText 오른쪽에있는 링크를.
    • 의 용지 찾기 Google 학술 검색을 하고, 제목 아래에 팝업에 이중 인용 표시를 클릭, 클릭 BibTeX .
    • 어떤 종이가 연결되어있는 경우, 당신은 사용할 수 있습니다 (예를 들어, 단지 웹 사이트가 없습니다) 하여 BibTex 온라인 편집기를 사용자 정의하여 BibTex 항목을 (드롭 다운 메뉴가있다 만드는 Online 항목 유형).

데이터세트 순서 유지

기본적으로 데이터 세트의 레코드는 동일한 클래스에 속한 레코드가 인접하는 경우가 많기 때문에 데이터 세트 전체에서 클래스 분포를 보다 균일하게 하기 위해 저장될 때 섞입니다. 위해서는 데이터 집합에 의해 제공 생성 된 키에 의해 정렬하도록 지정하는 _generate_examples 필드 disable_shuffling 로 설정해야 True . 기본적으로이 설정되어 False .

def _info(self):
  return tfds.core.DatasetInfo(
    # [...]
    disable_shuffling=True,
    # [...]
  )

셔플을 비활성화하면 샤드를 더 이상 병렬로 읽을 수 없으므로 성능에 영향을 미칩니다.

_split_generators : 다운로드 및 분할 데이터

소스 데이터 다운로드 및 추출

대부분의 데이터세트는 웹에서 데이터를 다운로드해야 합니다. 이 작업은 사용하여 수행됩니다 tfds.download.DownloadManager 입력 인수 _split_generators . dl_manager 다음과 같은 방법이 있습니다 :

  • download : 지원 http(s):// , ftp(s)://
  • extract : 현재 지원하는 .zip , .gz , 그리고 .tar 파일입니다.
  • download_and_extract : 동일 dl_manager.extract(dl_manager.download(urls))

그 모든 방법을 반환 tfds.core.ReadOnlyPath 있으며, pathlib.Path 같은 개체를.

이러한 방법 지지체는 중첩 구조 (임의 list , dict 등) :

extracted_paths = dl_manager.download_and_extract({
    'foo': 'https://example.com/foo.zip',
    'bar': 'https://example.com/bar.zip',
})
# This returns:
assert extracted_paths == {
    'foo': Path('/path/to/extracted_foo/'),
    'bar': Path('/path/extracted_bar/'),
}

수동 다운로드 및 추출

일부 데이터가 자동으로 (예 : 로그인이 필요한),이 경우, 사용자가 수동으로 소스 데이터를 다운로드하고에 배치 다운로드 할 수 없습니다 manual_dir/ (기본값 ~/tensorflow_datasets/downloads/manual/ ).

파일은 다음을 통해 액세스 할 수 있습니다 dl_manager.manual_dir :

class MyDataset(tfds.core.GeneratorBasedBuilder):

  MANUAL_DOWNLOAD_INSTRUCTIONS = """
  Register into https://example.org/login to get the data. Place the `data.zip`
  file in the `manual_dir/`.
  """

  def _split_generators(self, dl_manager):
    # data_path is a pathlib-like `Path('<manual_dir>/data.zip')`
    archive_path = dl_manager.manual_dir / 'data.zip'
    # Extract the manually downloaded `data.zip`
    extracted_path = dl_manager.extract(archive_path)
    ...

manual_dir 위치는 사용자 정의 할 수 있습니다 tfds build --manual_dir= 또는 사용 tfds.download.DownloadConfig .

아카이브 직접 읽기

dl_manager.iter_archive 이들을 추출없이 순차적 아카이브를 판독한다. 이것은 저장 공간을 절약하고 일부 파일 시스템의 성능을 향상시킬 수 있습니다.

for filename, fobj in dl_manager.iter_archive('path/to/archive.zip'):
  ...

fobj 동일한 방법 갖는다 with open('rb') as fobj: (예 fobj.read() )

데이터세트 분할 지정

데이터 세트는 미리 정의 된 분할되어있는 경우 (예를 들어 MNISTtraintest 분할), 그 유지. 그렇지 않으면, 단 하나의 지정 tfds.Split.TRAIN 분할. 사용자는 동적으로 자신의 subsplits 만들 수 있습니다 subsplit API를 (예를 들어 split='train[80%:]' ).

def _split_generators(self, dl_manager):
  # Download source data
  extracted_path = dl_manager.download_and_extract(...)

  # Specify the splits
  return {
      'train': self._generate_examples(
          images_path=extracted_path / 'train_imgs',
          label_path=extracted_path / 'train_labels.csv',
      ),
      'test': self._generate_examples(
          images_path=extracted_path / 'test_imgs',
          label_path=extracted_path / 'test_labels.csv',
      ),
  }

_generate_examples : 실시 예 발생기

_generate_examples 소스 데이터로부터 각 스플릿에 대한 실시 예를 생성한다.

이 방법은 일반적으로 (예 : CSV 파일) 및 수율 소스 데이터 세트 아티팩트를 읽습니다 (key, feature_dict) 튜플 :

  • key : 실시 예 식별자. 결정 론적에 사용 사용 예 셔플 hash(key) 셔플이 해제 된 경우 (섹션 참조 키 또는 정렬을 세트로 순서를 유지 보수 ). 해야한다:
    • 고유의 두 예는 동일한 키를 사용하는 경우 예외가 발생합니다.
    • 결정 :해야이에 의존하지 download_dir , os.path.listdir 순서, ... 생성 된 데이터는 두 번 같은 키를 산출한다.
    • 비교 : 셔플을 사용하지 않으면 키가 데이터 집합을 정렬하는 데 사용됩니다.
  • feature_dict 하십시오의 dict 예시적인 값을 포함.
    • 구조는 일치해야합니다 features= 에 정의 된 구조 tfds.core.DatasetInfo .
    • 복잡한 데이터 유형(이미지, 비디오, 오디오 등)은 자동으로 인코딩됩니다.
    • 각 기능은 종종 복수의 입력 형식을 수용 (예를 들어 비디오 접수 /path/to/vid.mp4 , np.array(shape=(l, h, w, c)) , List[paths] , List[np.array(shape=(h, w, c)] , List[img_bytes] , ...)
    • 참고 항목 기능 커넥터 가이드 추가 정보를 원하시면.
def _generate_examples(self, images_path, label_path):
  # Read the input data out of the source files
  with label_path.open() as f:
    for row in csv.DictReader(f):
      image_id = row['image_id']
      # And yield (key, feature_dict)
      yield image_id, {
          'image_description': row['description'],
          'image': images_path / f'{image_id}.jpeg',
          'label': row['label'],
      }

파일 액세스 및 tf.io.gfile

클라우드 스토리지 시스템을 지원하려면 Python 내장 I/O 작업을 사용하지 마십시오.

대신, dl_manager 반환 pathlib 같은 구글 클라우드 스토리지와 직접 호환 제품 :

path = dl_manager.download_and_extract('http://some-website/my_data.zip')

json_path = path / 'data/file.json'

json.loads(json_path.read_text())

또한, 사용 tf.io.gfile 대신 API 내장 파일 작업을 위해 :

Pathlib는에 선호한다 tf.io.gfile 참조 ( 합리적 .

추가 종속성

일부 데이터 세트에는 생성 중에만 추가 Python 종속성이 필요합니다. 예를 들어, 데이터 세트 SVHN 용도 scipy 일부 데이터를로드.

당신이 TFDS 저장소에 데이터 세트를 추가하는 경우, 사용하십시오 tfds.core.lazy_imports 킵하는 tensorflow-datasets 작은 패키지. 사용자는 필요한 경우에만 추가 종속성을 설치합니다.

사용 lazy_imports :

  • 로 데이터 세트에 대한 항목 추가 DATASET_EXTRAS 에서 setup.py . 이를 통해 사용자는, 예를 들어, 할 수 있도록한다 pip install 'tensorflow-datasets[svhn]' 추가 종속성을 설치합니다.
  • 에 가져 오기에 대한 항목 추가 LazyImporter 과에 LazyImportsTest .
  • 사용 tfds.core.lazy_imports (예를 들어, 의존성에 액세스 할 수 tfds.core.lazy_imports.scipy 당신에) DatasetBuilder .

손상된 데이터

일부 데이터 세트는 완벽하게 깨끗하지 않고 일부 손상된 데이터를 포함합니다(예: 이미지는 JPEG 파일이지만 일부는 잘못된 JPEG임). 이러한 예는 건너뛰어야 하지만 데이터 세트 설명에 삭제된 예의 수와 이유를 기록해 두십시오.

데이터세트 구성/변형(tfds.core.BuilderConfig)

일부 데이터 세트에는 데이터가 사전 처리되고 디스크에 기록되는 방법에 대한 여러 변형 또는 옵션이 있을 수 있습니다. 예를 들어, cycle_gan는 오브젝트 쌍 (하나씩 가지고 구성 cycle_gan/horse2zebra , cycle_gan/monet2photo , ...).

이를 통해 이루어집니다 tfds.core.BuilderConfig 의 :

  1. 의 서브 클래스로 구성 객체를 정의 tfds.core.BuilderConfig . 예를 들어, MyDatasetConfig .

    @dataclasses.dataclass
    class MyDatasetConfig(tfds.core.BuilderConfig):
      img_size: Tuple[int, int] = (0, 0)
    
  2. 정의 BUILDER_CONFIGS = [] 에서 반원 MyDataset 해당 목록 MyDatasetConfig 의 해당 데이터 셋 공개한다.

    class MyDataset(tfds.core.GeneratorBasedBuilder):
      VERSION = tfds.core.Version('1.0.0')
      # pytype: disable=wrong-keyword-args
      BUILDER_CONFIGS = [
          # `name` (and optionally `description`) are required for each config
          MyDatasetConfig(name='small', description='Small ...', img_size=(8, 8)),
          MyDatasetConfig(name='big', description='Big ...', img_size=(32, 32)),
      ]
      # pytype: enable=wrong-keyword-args
    
  3. 사용 self.builder_config 에서 MyDataset 구성 데이터 생성에 (예를 들어, shape=self.builder_config.img_size ). 이것은 서로 다른 설정 값을 포함 할 수있다 _info() 또는 변경 다운로드 데이터 액세스.

메모:

  • 각 구성에는 고유한 이름이 있습니다. 설정의 완전한 이름입니다 dataset_name/config_name (예 : coco/2017 ).
  • 지정되지 않은 경우, 최초의 설정 BUILDER_CONFIGS 사용됩니다 (예를 들어 tfds.load('c4') 에 기본 c4/en )

참조 anli 사용하는 데이터 세트의 예를 들어 BuilderConfig 의.

버전

버전은 두 가지 다른 의미를 나타낼 수 있습니다.

  • "외부" 원본 데이터 버전: 예: COCO v2019, v2017,...
  • 은 "내부"TFDS 코드 버전 :에서 예를 들어 이름 바꾸기 기능 tfds.features.FeaturesDict , 버그 수정 _generate_examples

데이터세트를 업데이트하려면:

  • "외부" 데이터 업데이트의 경우: 여러 사용자가 특정 연도/버전에 동시에 액세스하기를 원할 수 있습니다. 이것은 하나를 사용하여 수행됩니다 tfds.core.BuilderConfig 버전마다 (예 : coco/2017 , coco/2019 ) 또는 버전마다 하나 개의 클래스 (예를 들어 Voc2007 , Voc2012 ).
  • "내부" 코드 업데이트의 경우: 사용자는 최신 버전만 다운로드합니다. 모든 코드 업데이트는 증가 할 VERSION (예에서 class 속성 1.0.0VERSION = tfds.core.Version('2.0.0') 다음) 의미 버전을 .

등록을 위해 가져오기 추가

프로젝트에 데이터 세트 모듈을 가져올 것을 잊지 마십시오 __init__ 자동으로 등록 할 tfds.load , tfds.builder .

import my_project.datasets.my_dataset  # Register MyDataset

ds = tfds.load('my_dataset')  # MyDataset available

당신이에 기여하는 경우 예를 들어, tensorflow/datasets , 그 하위 디렉토리의에 모듈 가져 오기를 추가 __init__.py (예 : image/__init__.py .

일반적인 구현 문제 확인

확인하시기 바랍니다 일반적인 구현의 개는 .

데이터세트 테스트

다운로드 및 준비는 : tfds build

데이터 세트를 생성하려면, 실행 tfds build 으로부터 my_dataset/ 디렉토리 :

cd path/to/datasets/my_dataset/
tfds build --register_checksums

개발에 유용한 플래그:

  • --pdb : 예외가 발생하면 모드 디버깅을 입력합니다.
  • --overwrite : 삭제 기존 파일을 데이터 세트가 이미 생성 된 경우.
  • --max_examples_per_split : 첫 번째 X의 예 (1 기본값)보다는 전체 데이터 세트를 생성합니다.
  • --register_checksums : 다운로드 URL을 기록 체크섬. 개발 중에만 사용해야 합니다.

참고 항목 CLI 문서 플래그의 전체 목록을.

체크섬

그것은 보증 결정론, 문서에 대한 도움말로 데이터 세트의 체크섬을 기록하는 것이 좋습니다 ... 이렇게와 데이터 세트 생성하여 수행됩니다 --register_checksums (이전 섹션 참조).

당신이 PyPI을 통해 데이터 세트를 해제하는 경우, 수출하는 것을 잊지 마세요 checksums.tsv (예 : 파일을 package_data 당신의 setup.py ).

데이터세트 단위 테스트

tfds.testing.DatasetBuilderTestCase 기본입니다 TestCase 완전히 데이터 집합을 행사할. 소스 데이터 세트의 구조를 모방한 테스트 데이터로 "더미 데이터"를 사용합니다.

  • 테스트 데이터에 넣어해야 my_dataset/dummy_data/ 디렉토리 및 다운로드 추출한 소스 데이터 세트의 유물을 모방해야한다. 그것은 스크립트 (수동 또는 자동으로 생성 할 수 있습니다 예를 들어 스크립트 ).
  • 데이터 세트 분할이 겹칠 경우 테스트가 실패하므로 테스트 데이터 분할에 다른 데이터를 사용해야 합니다.
  • 테스트 데이터는 저작권이있는 자료를 포함 할 수 없습니다. 확실하지 않은 경우 원본 데이터 세트의 자료를 사용하여 데이터를 생성하지 마십시오.
import tensorflow_datasets as tfds
from . import my_dataset


class MyDatasetTest(tfds.testing.DatasetBuilderTestCase):
  """Tests for my_dataset dataset."""
  DATASET_CLASS = my_dataset.MyDataset
  SPLITS = {
      'train': 3,  # Number of fake train example
      'test': 1,  # Number of fake test example
  }

  # If you are calling `download/download_and_extract` with a dict, like:
  #   dl_manager.download({'some_key': 'http://a.org/out.txt', ...})
  # then the tests needs to provide the fake output paths relative to the
  # fake data directory
  DL_EXTRACT_RESULT = {
      'name1': 'path/to/file1',  # Relative to dummy_data/my_dataset dir.
      'name2': 'file2',
  }


if __name__ == '__main__':
  tfds.testing.test_main()

다음 명령어를 실행하여 데이터세트를 테스트합니다.

python my_dataset_test.py

피드백 보내기

우리는 지속적으로 데이터 세트 생성 워크플로를 개선하기 위해 노력하고 있지만 문제를 인지한 경우에만 그렇게 할 수 있습니다. 데이터 세트를 생성하는 동안 어떤 문제, 오류가 발생했습니까? 혼란스럽거나 상용구로 표시되거나 처음에 작동하지 않는 부분이 있었습니까? 당신의 공유하시기 바랍니다 GitHub의에 대한 피드백을 .