Spacca e affetta

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Tutti i set di dati TFDS espongono varie suddivisioni di dati (ad es 'train' , 'test' ) che possono essere esplorate nel catalogo .

Oltre alle suddivisioni "ufficiali" del set di dati, TFDS consente di selezionare fette di suddivisione e varie combinazioni.

API per affettare

Le istruzioni di slicing sono specificate in tfds.load o tfds.DatasetBuilder.as_dataset tramite split= kwarg.

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

La divisione può essere:

  • Divisione semplice ( 'train' , 'test' ): tutti gli esempi all'interno della divisione selezionata.
  • Fette : le fette hanno la stessa semantica della notazione della fetta di Python . Le fette possono essere:
    • Absolute ( 'train[123:450]' , train[:4000] ): (vedi nota sotto per avvertimenti sull'ordine di lettura)
    • Percentuale ( 'train[:75%]' , 'train[25%:75%]' ): divide i dati completi in 100 sezioni pari. Se i dati non sono divisibili per 100, una certa percentuale potrebbe contenere ulteriori esempi.
    • Shard ( train[:4shard] , train[4shard] ): seleziona tutti gli esempi nello shard richiesto. (vedi info.splits['train'].num_shards per ottenere il numero di frammenti della divisione)
  • Unione delle divisioni ( 'train+test' , 'train[:25%]+test' ): le divisioni saranno intercalate insieme.
  • Set di dati completo ( 'all' ): 'all' è un nome di divisione speciale corrispondente all'unione di tutte le divisioni (equivalente a 'train+test+...' ).
  • Elenco di suddivisioni ( ['train', 'test'] ): più tf.data.Dataset vengono restituiti separatamente:
# Returns both train and test split separately
train_ds, test_ds = tfds.load('mnist', split=['train', 'test[:50%]'])

tfds.even_splits e formazione multi-host

tfds.even_splits genera un elenco di sub-split non sovrapposti della stessa dimensione.

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

Ciò può essere particolarmente utile durante l'addestramento in un ambiente distribuito, in cui ogni host dovrebbe ricevere una porzione dei dati originali.

Con Jax , questo può essere ulteriormente semplificato usando 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 è un semplice alias per:

# 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 accetta qualsiasi valore diviso come input (ad esempio 'train[75%:]+test' )

Slicing e metadati

È possibile ottenere informazioni aggiuntive sugli split/subsplit ( num_examples , file_instructions ,...) utilizzando le informazioni sul set di dati:

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']

Convalida incrociata

Esempi di convalida incrociata 10 volte utilizzando l'API di stringa:

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

I set di dati di convalida saranno ciascuno del 10%: [0%:10%] , [10%:20%] , ..., [90%:100%] . E i set di dati di addestramento saranno ciascuno il 90% complementare: [10%:100%] (per un set di convalida corrispondente di [0%:10%] ), `[0%:10%]

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

tfds.core.ReadInstruction e arrotondamento

Piuttosto che str , è possibile passare le divisioni come tfds.core.ReadInstruction :

Ad esempio, split = 'train[50%:75%] + test' equivale a:

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

l' unit può essere:

  • abs : Affettatura assoluta
  • % : Affettatura percentuale
  • shard : Affettatura del frammento

tfds.ReadInstruction ha anche un argomento di arrotondamento. Se il numero di esempi nel set di dati non è diviso equamente per 100 :

  • rounding='closest' (predefinito): gli esempi rimanenti sono distribuiti tra le percentuali, quindi alcune percentuali potrebbero contenere esempi aggiuntivi.
  • rounding='pct1_dropremainder' : gli esempi rimanenti vengono eliminati, ma questo garantisce che tutte le percentuali contengano esattamente lo stesso numero di esempi (ad esempio: len(5%) == 5 * len(1%) ).

Riproducibilità e determinismo

Durante la generazione, per una determinata versione del set di dati, TFDS garantisce che gli esempi vengano mischiati deterministicamente su disco. Pertanto, la generazione del set di dati due volte (in 2 computer diversi) non cambierà l'ordine dell'esempio.

Allo stesso modo, l'API subsplit selezionerà sempre lo stesso set di esempi, indipendentemente dalla piattaforma, dall'architettura, ecc. Ciò significa set('train[:20%]') == set('train[:10%]') + set('train[10%:20%]') .

Tuttavia, l'ordine in cui vengono letti gli esempi potrebbe non essere deterministico. Questo dipende da altri parametri (ad esempio se shuffle_files=True ).