Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Suggerimenti sulle prestazioni

Questo documento fornisce suggerimenti sulle prestazioni specifici del TFDS. Si noti che TFDS fornisce set di dati come tf.data.Dataset s, quindi si applicano ancora i consigli della guida tf.data .

Piccoli set di dati (<GB)

Tutti i set di dati TFDS memorizzano i dati su disco nel formato TFRecord . Per piccoli set di dati (ad esempio Mnist, Cifar, ...), la lettura da .tfrecord può aggiungere un notevole sovraccarico.

Poiché tali set di dati si adattano alla memoria, è possibile migliorare significativamente le prestazioni memorizzando nella cache o pre-caricando il set di dati. Si noti che TFDS memorizza automaticamente nella cache piccoli set di dati (vedere la sezione successiva per i dettagli).

Memorizzazione nella cache del set di dati

Ecco un esempio di pipeline di dati che memorizza in modo esplicito il set di dati dopo aver normalizzato le immagini.

 def normalize_img(image, label):
  """Normalizes images: `uint8` -> `float32`."""
  return tf.cast(image, tf.float32) / 255., label


ds, ds_info = tfds.load(
    'mnist',
    split='train',
    as_supervised=True,  # returns `(img, label)` instead of dict(image=, ...)
    with_info=True,
)
# Applying normalization before `ds.cache()` to re-use it.
# Note: Random transformations (e.g. images augmentations) should be applied
# after both `ds.cache()` (to avoid caching randomness) and `ds.batch()` (for
# vectorization [1]).
ds = ds.map(normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)
ds = ds.cache()
# For true randomness, we set the shuffle buffer to the full dataset size.
ds = ds.shuffle(ds_info.splits['train'].num_examples)
# Batch after shuffling to get unique batches at each epoch.
ds = ds.batch(128)
ds = ds.prefetch(tf.data.experimental.AUTOTUNE)
 

Quando si scorre su questo set di dati, la seconda iterazione sarà molto più veloce della prima grazie alla memorizzazione nella cache.

Auto-caching

Per impostazione predefinita, TFDS memorizza automaticamente nella cache i set di dati che soddisfano i seguenti vincoli:

  • La dimensione totale del set di dati (tutte le suddivisioni) è definita e <250 MiB
  • shuffle_files è disabilitato o viene letto solo un singolo frammento

È possibile disattivare la memorizzazione automatica nella cache passando try_autocaching=False a tfds.ReadConfig in tfds.load . Dai un'occhiata alla documentazione del catalogo del set di dati per vedere se un set di dati specifico utilizzerà la cache automatica.

Caricamento dei dati completi come un singolo tensore

Se il set di dati si adatta alla memoria, è anche possibile caricare il set di dati completo come un singolo array Tensor o NumPy. È possibile farlo impostando batch_size=-1 per batch_size=-1 tutti gli esempi in un singolo tf.Tensor . Quindi utilizzare tfds.as_numpy per la conversione da tf.Tensor a np.array .

 (img_train, label_train), (img_test, label_test) = tfds.as_numpy(tfds.load(
    'mnist',
    split=['train', 'test'],
    batch_size=-1,
    as_supervised=True,
))
 

Set di dati di grandi dimensioni

I set di dati di grandi dimensioni sono suddivisi (suddivisi in più file) e in genere non si adattano alla memoria, pertanto non devono essere memorizzati nella cache.

Riproduzione casuale e allenamento

Durante l'allenamento, è importante mescolare bene i dati; dati scarsamente mescolati possono comportare una precisione di allenamento inferiore.

Oltre a utilizzare ds.shuffle per mescolare i record, è necessario impostare shuffle_files=True per ottenere un buon comportamento di shuffle per insiemi di dati più grandi che sono suddivisi in più file. Altrimenti, le epoche leggeranno i frammenti nello stesso ordine e quindi i dati non saranno realmente randomizzati.

 ds = tfds.load('imagenet2012', split='train', shuffle_files=True)
 

Inoltre, quando shuffle_files=True , TFDS disabilita options.experimental_deterministic , che può dare un leggero aumento delle prestazioni. Per ottenere il mescolamento deterministico, è possibile disattivare questa funzione con tfds.ReadConfig : impostando read_config.shuffle_seed o sovrascrivendo read_config.options.experimental_deterministic .

Decodifica delle immagini più rapida

Per impostazione predefinita, TFDS decodifica automaticamente le immagini. Tuttavia, ci sono casi in cui può essere più performante saltare la decodifica dell'immagine con tfds.decode.SkipDecoding e applicare manualmente l'op tf.io.decode_image :

  • Quando si filtrano esempi (con ds.filter ), per decodificare le immagini dopo che gli esempi sono stati filtrati.
  • Quando si ritagliano le immagini, per utilizzare il file tf.image.decode_and_crop_jpeg fuso op.

Il codice per entrambi gli esempi è disponibile nella guida alla decodifica .