Разделение и нарезка

Все наборы данных TFDS разоблачать различные расколы данных (например , 'train' , 'test' ) , которые могут быть изучены в каталоге .

В дополнение к «официальным» разбиениям набора данных, 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' ): Все примеры в рамках разделения выбранного.
  • Кусочки: Ломтики имеют тот же семантический , как срез питон нотации . Ломтики могут быть:
    • Absolute ( '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:

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

tfds.even_splits принимает на любом разделенном значении в качестве входных данных (например , 'train[75%:]+test' )

Нарезка и метаданные

Можно получить дополнительную информацию о расколах / subsplits ( 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']

Перекрестная проверка

Примеры 10-кратной перекрестной проверки с использованием строкового API:

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 [10%: 20%] `), ...

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 : Absolute нарезка
  • % : Процент нарезка
  • 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%]') .

Тем не менее, порядок , в котором пример чтения не может быть детерминированным. Это зависит от других параметров (например , является ли shuffle_files=True ).