Ayuda a proteger la Gran Barrera de Coral con TensorFlow en Kaggle Únete Challenge

Fracturas y rebanado

Todos los conjuntos de datos TFDS exponen diversas divisiones de datos (por ejemplo, 'train' , 'test' ) que se puede explorar en el catálogo .

Además de las divisiones de conjuntos de datos "oficiales", TFDS permite seleccionar secciones de divisiones y varias combinaciones.

API de rebanado

Instrucciones de cortado se especifican en tfds.load o tfds.DatasetBuilder.as_dataset a través de la split= kwarg.

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

Split puede ser:

  • División normal (de 'train' , 'test' ): Todos los ejemplos dentro de la división seleccionada.
  • Rebanadas: Rebanadas tienen la misma semántica como la notación rebanada pitón . Las rebanadas pueden ser:
    • Absoluta ( 'train[123:450]' , train[:4000] ): (ver nota más abajo para salvedad sobre el orden de lectura)
    • Porcentaje ( 'train[:75%]' , 'train[25%:75%]' ): dividir los datos completos en 100 rebanadas pares. Si los datos no son divisibles por 100, algún porcentaje puede contener ejemplos adicionales.
    • Fragmento ( train[:4shard] , train[4shard] ): Seleccionar todos los ejemplos en el fragmento solicitado. (ver info.splits['train'].num_shards para obtener el número de fragmentos de la fractura)
  • Unión de divisiones ( 'train+test' , 'train[:25%]+test' ): Fracturas se entrelazan entre sí.
  • Conjunto de datos completo ( 'all' ): 'all' es un nombre de división especial que corresponde a la unión de todas las divisiones (equivalente a 'train+test+...' ).
  • Lista de divisiones ( ['train', 'test'] ): múltiple tf.data.Dataset se devuelven por separado:
# Returns both train and test split separately
train_ds, test_ds = tfds.load('mnist', split=['train', 'test[50%]'])

tfds.even_splits y la formación de múltiples anfitrión

tfds.even_splits genera una lista de no solapados sub-divisiones del mismo tamaño.

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

Esto puede ser particularmente útil cuando se entrena en un entorno distribuido, donde cada host debería recibir una porción de los datos originales. Aquí hay un ejemplo con jax:

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

tfds.even_splits acepta cualquier valor de división como entrada (por ejemplo, 'train[75%:]+test' )

Rebanado y metadatos

Es posible obtener información adicional acerca de los Splits / subsplits ( num_examples , file_instructions , ...) utilizando la información de conjunto de datos :

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

Validación cruzada

Ejemplos de validación cruzada de 10 veces utilizando la API de cadena:

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

Los conjuntos de datos de validación están cada uno va a ser 10%: [0%:10%] , [10%:20%] , ..., [90%:100%] . Y los conjuntos de datos de entrenamiento son cada uno va a ser el complementaria 90%: [10%:100%] (para un correspondiente conjunto de validación de [0%:10%] ), `[0%: 10%]

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

tfds.core.ReadInstruction y redondeo

En lugar de str , es posible pasar divisiones como tfds.core.ReadInstruction :

Por ejemplo, split = 'train[50%:75%] + test' es equivalente a:

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

unit puede ser:

  • abs : slicing Absolute
  • % : Porcentaje de rebanado
  • shard : Fragmento de rebanado

tfds.ReadInstruction también tiene un argumento redondeo. Si el número de ejemplo, en el conjunto de datos no es dividir uniformemente por 100 :

  • rounding='closest' (por defecto): Los ejemplos restantes se distribuyen entre el porcentaje, por lo que algunos por ciento podría contener ejemplos adicionales.
  • rounding='pct1_dropremainder' : Los ejemplos restantes se dejan caer, pero esta garantía todos ciento contener el mismo número exacto de ejemplo (por ejemplo: len(5%) == 5 * len(1%) ).

Reproducibilidad y determinismo

Durante la generación, para una versión de conjunto de datos determinada, TFDS garantiza que los ejemplos se barajan de forma determinista en el disco. Entonces, generar el conjunto de datos dos veces (en 2 computadoras diferentes) no cambiará el orden del ejemplo.

Del mismo modo, la API subsplit siempre seleccionará el mismo set de ejemplos, independientemente de la plataforma, la arquitectura, etc. Este medio set('train[:20%]') == set('train[:10%]') + set('train[10%:20%]') .

Sin embargo, el orden en que se leen los ejemplos no podría ser determinista. Esto depende de otros parámetros (por ejemplo, si shuffle_files=True ).