분할 및 슬라이싱

모든 TFDS 데이터 세트는 카탈로그 에서 탐색할 수 있는 다양한 데이터 분할(예: 'train' , 'test' )을 노출합니다.

"공식" 데이터 세트 분할 외에도 TFDS를 사용하면 분할 분할 및 다양한 조합을 선택할 수 있습니다.

슬라이싱 API

슬라이싱 지침은 split= kwarg를 통해 tfds.load 또는 tfds.DatasetBuilder.as_dataset 에 지정됩니다.

ds = tfds.load('my_dataset', split='train[:75%]')
builder = tfds.builder('my_dataset')
ds = builder.as_dataset(split='test+train[:75%]')

분할은 다음과 같을 수 있습니다.

  • 일반 분할 ( 'train' , 'test' ): 분할 내의 모든 예가 선택되었습니다.
  • 슬라이스 : 슬라이스는 파이썬 슬라이스 표기법 과 동일한 의미를 갖습니다. 슬라이스는 다음과 같을 수 있습니다.
    • 절대 ( 'train[123:450]' , train[:4000] ): (읽기 순서에 대한 주의 사항은 아래 참고 참조)
    • 백분율 ( 'train[:75%]' , 'train[25%:75%]' ): 전체 데이터를 100개의 짝수 조각으로 나눕니다. 데이터를 100으로 나눌 수 없는 경우 일부 백분율에 추가 예가 포함될 수 있습니다.
    • 샤드 ( train[:4shard] , train[4shard] ): 요청된 샤드에서 모든 예제를 선택합니다. (분할의 샤드 수를 얻으려면 info.splits['train'].num_shards 참조)
  • 분할의 합집합 ( 'train+test' , 'train[:25%]+test' ): 분할이 함께 인터리브됩니다.
  • 전체 데이터 세트 ( 'all' ): 'all' 은 모든 분할의 합집합에 해당하는 특수 분할 이름입니다( 'train+test+...' 와 동일).
  • 분할 목록 ( ['train', 'test'] ): 여러 tf.data.Dataset 이 별도로 반환됩니다.
# Returns both train and test split separately
train_ds, test_ds = tfds.load('mnist', split=['train', 'test[:50%]'])

tfds.even_splits 및 다중 호스트 교육

tfds.even_splits 는 동일한 크기의 비중첩 하위 분할 목록을 생성합니다.

# Divide the dataset into 3 even parts, each containing 1/3 of the data
split0, split1, split2 = tfds.even_splits('train', n=3)

ds = tfds.load('my_dataset', split=split2)

이는 각 호스트가 원본 데이터의 조각을 받아야 하는 분산 설정에서 교육할 때 특히 유용할 수 있습니다.

Jax 를 사용하면 tfds.split_for_jax_process 를 사용하여 훨씬 더 단순화할 수 있습니다.

split = tfds.split_for_jax_process('train', drop_remainder=True)
ds = tfds.load('my_dataset', split=split)

tfds.split_for_jax_process 는 다음의 간단한 별칭입니다.

# The current `process_index` loads only `1 / process_count` of the data.
splits = tfds.even_splits('train', n=jax.process_count(), drop_remainder=True)
split = splits[jax.process_index()]

tfds.even_splits , tfds.split_for_jax_process 는 모든 분할 값을 입력으로 허용합니다(예: 'train[75%:]+test' ).

슬라이싱 및 메타데이터

데이터 세트 정보 를 사용하여 분할/하위 분할( num_examples , file_instructions ,...)에 대한 추가 정보를 얻을 수 있습니다.

builder = tfds.builder('my_dataset')
builder.info.splits['train'].num_examples  # 10_000
builder.info.splits['train[:75%]'].num_examples  # 7_500 (also works with slices)
builder.info.splits.keys()  # ['train', 'test']

교차 검증

문자열 API를 사용한 10겹 교차 검증의 예:

vals_ds = tfds.load('mnist', split=[
    f'train[{k}%:{k+10}%]' for k in range(0, 100, 10)
])
trains_ds = tfds.load('mnist', split=[
    f'train[:{k}%]+train[{k+10}%:]' for k in range(0, 100, 10)
])

검증 데이터 세트는 각각 10%: [0%:10%] , [10%:20%] , ..., [90%:100%] 가 됩니다. 그리고 훈련 데이터 세트는 각각 보완적인 90%가 됩니다: [10%:100%] ( [0%:10%] 의 해당 검증 세트에 대해), `[0%:10%]

  • [20%:100%] (for a validation set of ),...

tfds.core.ReadInstruction 및 반올림

str 대신 분할을 tfds.core.ReadInstruction 으로 전달할 수 있습니다.

예를 들어 split = 'train[50%:75%] + test' 는 다음과 같습니다.

split = (
    tfds.core.ReadInstruction(
        'train',
        from_=50,
        to=75,
        unit='%',
    )
    + tfds.core.ReadInstruction('test')
)
ds = tfds.load('my_dataset', split=split)

unit 는 다음과 같을 수 있습니다.

  • abs : 절대 슬라이싱
  • % : 슬라이싱 비율
  • shard : 샤드 슬라이싱

tfds.ReadInstruction 에는 반올림 인수도 있습니다. 데이터 세트의 예제 수가 100 으로 균등하게 나누지 않은 경우:

  • rounding='closest' (기본값): 나머지 예제는 백분율로 분산되므로 일부 백분율에는 추가 예제가 포함될 수 있습니다.
  • rounding='pct1_dropremainder' : 나머지 예제는 삭제되지만 모든 백분율에 정확히 동일한 수의 예제가 포함된다는 보장이 있습니다(예: len(5%) == 5 * len(1%) ).

재현성 및 결정성

생성하는 동안 주어진 데이터 세트 버전에 대해 TFDS는 예제가 디스크에서 결정적으로 섞이도록 보장합니다. 따라서 데이터 세트를 두 번(2개의 다른 컴퓨터에서) 생성해도 예제 순서는 변경되지 않습니다.

마찬가지로, subsplit API는 플랫폼, 아키텍처 등에 관계없이 항상 동일한 예제 set 을 선택합니다. 이는 set('train[:20%]') == set('train[:10%]') + set('train[10%:20%]') 의미합니다. set('train[:20%]') == set('train[:10%]') + set('train[10%:20%]') .

그러나 예제를 읽는 순서는 결정적 이지 않을 수 있습니다. 이것은 다른 매개변수에 따라 다릅니다(예: shuffle_files=True 여부).