Splitten und Schneiden

Alle TFDS Datensätze verschiedene Daten Splits (zB aussetzen 'train' , 'test' ) , die im erkundet werden kann Katalog .

Zusätzlich zu den "offiziellen" Datensatz-Splits ermöglicht TFDS die Auswahl von Slice(s) von Split(s) und verschiedenen Kombinationen.

Slicing-API

Slicing Anweisungen sind in angegeben tfds.load oder tfds.DatasetBuilder.as_dataset durch die split= kwarg.

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

Aufteilung kann sein:

  • Plain split ( 'train' , 'test' ): Alle Beispiele in den geteilten ausgewählt.
  • Scheiben: Scheiben haben die gleiche Semantik wie Python Slice - Notation . Scheiben können sein:
    • Absolute ( 'train[123:450]' , train[:4000] ): (Anmerkung unten für caveat über Lese , um zu sehen)
    • Prozent ( 'train[:75%]' , 'train[25%:75%]' ): Teilen Sie die vollständigen Daten in 100 sogar Scheiben schneiden. Wenn die Daten nicht durch 100 teilbar sind, können einige Prozent zusätzliche Beispiele enthalten.
    • Splitter ( train[:4shard] , train[4shard] ): Wählen Sie alle Beispiele in der gewünschten Scherbe. (siehe info.splits['train'].num_shards die Anzahl der Scherben der Spaltung zu bekommen)
  • Union der Teilungen ( 'train+test' , 'train[:25%]+test' ): Splits zusammen verschachtelt werden.
  • Volldatensatz ( 'all' ): 'all' ist ein spezieller Split Namen der Vereinigung aller Splits (äquivalent zu entsprechenden 'train+test+...' ).
  • Liste der Splits ( ['train', 'test'] ): Mehrere tf.data.Dataset werden separat zurückgegeben:
# Returns both train and test split separately
train_ds, test_ds = tfds.load('mnist', split=['train', 'test[50%]'])

tfds.even_splits & Multi-Host - Training

tfds.even_splits erzeugt eine Liste der nicht überlappenden Unter Splits von gleicher Größe.

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

Dies kann besonders nützlich sein, wenn Sie in einer verteilten Umgebung trainieren, in der jeder Host einen Ausschnitt der Originaldaten erhalten soll. Hier ist ein Beispiel mit 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 nimmt auf jedem geteilten Wert als Eingabe (zB 'train[75%:]+test' )

Slicen und Metadaten

Es ist möglich , zusätzliche Informationen über die Splits / subsplits (um num_examples , file_instructions , ...) , um die Verwendung von Daten - Set Info :

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

Kreuzvalidierung

Beispiele für eine 10-fache Kreuzvalidierung mit der String-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)
])

Die Validierungs Datensätze werden jeweils 10% sein: [0%:10%] , [10%:20%] , ..., [90%:100%] . Und die Trainingsdatensätze werden jeweils das komplementäre 90% sein: [10%:100%] (für einen entsprechenden Validierungssatz von [0%:10%] ), `[0%: 10%]

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

tfds.core.ReadInstruction und Rundung

Anstatt str , ist es möglich , Splits als passieren tfds.core.ReadInstruction :

Zum Beispiel split = 'train[50%:75%] + test' entspricht:

split = (
    tfds.core.ReadInstruction(
        'train',
        from_=50,
        to=75,
        unit='%',
    )

    + tfds.core.ReadInstruction('test')
)
ds = tfds.load('my_dataset', split=split)

unit können sein:

  • abs : Absolute Slicing
  • % : Prozent Slicing
  • shard : Shard Slicing

tfds.ReadInstruction hat auch eine Rundung Argument. Wenn die Anzahl der im Datensatz Beispiel teilen ist nicht gleichmäßig von 100 :

  • rounding='closest' (Standard): Die restlichen Beispiele sind unter den Prozent verteilt, so dass einige Prozent weitere Beispiele enthalten könnten.
  • rounding='pct1_dropremainder' Die verbleibenden Beispiele werden fallen gelassen, aber dies mit Sicherheit Prozent enthalten , die genau die gleiche Anzahl von Beispiel (zB: len(5%) == 5 * len(1%) ).

Reproduzierbarkeit & Determinismus

Während der Generierung garantiert TFDS für eine gegebene Datensatzversion, dass Beispiele deterministisch auf der Festplatte gemischt werden. Das zweimalige Generieren des Datensatzes (in 2 verschiedenen Computern) ändert die Beispielreihenfolge nicht.

In ähnlicher Weise wird die subsplit API immer den gleichen Auswahl set von Beispielen, unabhängig von der Plattform, Architektur usw. Dieses Mittelwert - set('train[:20%]') == set('train[:10%]') + set('train[10%:20%]') .

Allerdings sind die Reihenfolge , in der beispielsweise liest vielleicht nicht deterministisch sein. Dies ist abhängig von anderen Parametern (zB ob shuffle_files=True ).