ML Community Day è il 9 novembre! Unisciti a noi per gli aggiornamenti da tensorflow, JAX, e più Per saperne di più

Spacca e affetta

Tutti i set di dati TFDS espongono varie divisioni di dati (ad esempio 'train' , 'test' ) che può essere esplorato nel catalogo .

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

API per affettare

Affettare le istruzioni sono specificate in tfds.load o tfds.DatasetBuilder.as_dataset attraverso la 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:

  • Split Plain ( 'train' , 'test' ): Tutti gli esempi all'interno della scissione selezionato.
  • Fette: Fette hanno la stessa semantica come fetta di pitone notazione . Le fette possono essere:
    • Assoluto ( 'train[123:450]' , train[:4000] ): (vedi nota muggito per avvertimento su ordine di lettura)
    • Percentuale ( 'train[:75%]' , 'train[25%:75%]' ): Dividere i dati completi in 100 fette anche. Se i dati non sono divisibili per 100, una percentuale potrebbe contenere ulteriori esempi.
    • Shard ( train[:4shard] , train[4shard] ): Selezionare tutti esempi nel frammento richiesto. (vedi info.splits['train'].num_shards per ottenere il numero di frammenti della scissione)
  • Unione delle divisioni ( 'train+test' , 'train[:25%]+test' ): Divide sarà intervallato insieme.
  • Set di dati completo ( 'all' ): 'all' è un nome di divisione speciale corrispondente ad un unione di tutte le suddivisioni (equivalente a 'train+test+...' ).
  • Elenco dei scissioni ( ['train', 'test'] ): Multiple 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 di formazione multi-host

tfds.even_splits genera un elenco di sotto-splits non sovrapposte di stesse dimensioni.

# 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. Ecco un esempio con 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 accetta qualsiasi valore spaccato come input (es 'train[75%:]+test' )

Slicing e metadati

E 'possibile ottenere ulteriori informazioni sui gruppi / subsplits ( num_examples , file_instructions , ...) utilizzando l'informazioni 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 di 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 vengono ogni andando essere 10%: [0%:10%] , [10%:20%] , ..., [90%:100%] . E i set di dati di addestramento sono ciascuno andando essere complementare 90%: [10%:100%] (per un corrispondente set di validazione di [0%:10%] ), `[0%: 10%]

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

tfds.core.ReadInstruction e arrotondamento

Piuttosto che str , è possibile passare divide 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)

unit può essere:

  • abs : affettare Absolute
  • % : Affettare Percentuale
  • shard : affettare Shard

tfds.ReadInstruction ha anche un argomento di arrotondamento. Se il numero di esempio nell'insieme di dati non è dividere equamente da 100 :

  • rounding='closest' (default): Gli esempi rimanenti sono distribuite tra la percentuale, così alcuni cento potrebbe contenere ulteriori esempi.
  • rounding='pct1_dropremainder' : Gli esempi rimanenti vengono eliminati, ma questa garanzia tutti percento contenere lo stesso numero esatto di esempio (es: len(5%) == 5 * len(1%) ).

Riproducibilità e determinismo

Durante la generazione, per una data versione del set di dati, TFDS garantisce che gli esempi vengano rimescolati in modo deterministico su disco. Quindi 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, architettura, ecc medio di set('train[:20%]') == set('train[:10%]') + set('train[10%:20%]') .

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