모든 TFDS 데이터세트는 카탈로그 에서 탐색할 수 있는 다양한 데이터 분할(예: 'train'
, 'test'
)을 노출합니다. all
(모든 분할의 통합에 해당하는 예약어임)을 제외하고 모든 알파벳 문자열을 분할 이름으로 사용할 수 있습니다. 아래 참조.
"공식" 데이터세트 분할 외에도 TFDS에서는 분할 조각과 다양한 조합을 선택할 수 있습니다.
슬라이싱 API
슬라이싱 지침은 tfds.load
또는 tfds.DatasetBuilder.as_dataset
에서 split=
kwarg를 통해 지정됩니다.
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%]'
): 전체 데이터를 짝수 조각으로 나눕니다. 데이터를 균등하게 나눌 수 없는 경우 일부 퍼센트에 추가 예가 포함될 수 있습니다. 분수 백분율이 지원됩니다. - 샤드 (
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'
).
슬라이싱 및 메타데이터
데이터 세트 info를 사용하여 분할/하위 분할( 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
에는 반올림 인수도 있습니다. 데이터 세트의 예시 수가 균등하게 나누어지지 않은 경우:
-
rounding='closest'
(기본값): 나머지 예는 백분율에 분산되므로 일부 백분율에는 추가 예가 포함될 수 있습니다. -
rounding='pct1_dropremainder'
: 나머지 예제는 삭제되지만 이는 모든 퍼센트에 정확히 동일한 수의 예제가 포함된다는 것을 보장합니다(예:len(5%) == 5 * len(1%)
).
재현성 및 결정성
생성 중에 특정 데이터 세트 버전에 대해 TFDS는 예제가 디스크에서 결정론적으로 섞이도록 보장합니다. 따라서 데이터 세트를 두 번(2대의 다른 컴퓨터에서) 생성해도 예제 순서는 변경되지 않습니다.
마찬가지로 하위 분할 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
여부)에 따라 다릅니다.