Conversione di un set di dati di classificazione delle immagini per l'utilizzo con Cloud TPU
Questo tutorial descrive come utilizzare il convertitore dei dati di classificazione delle immagini esempio per convertire un set di dati di classificazione delle immagini non elaborate nel formato TFRecord utilizzato per addestrare i modelli Cloud TPU.
I TFRecord rendono
leggere file di grandi dimensioni da Cloud Storage è più efficiente che leggere ogni singolo file
come singolo file. Puoi utilizzare TFRecord ovunque utilizzi un
pipeline tf.data.Dataset
.
Per ulteriori informazioni sull'utilizzo di TFRecord, consulta i seguenti documenti di TensorFlow:
- TFRecord e tf.train.Example
- tf.data.Dataset
- tf.data: Creare pipeline di input TensorFlow
- Lettore e scrittore di TFRecord di PyTorch
Se utilizzi il framework PyTorch o JAX e non utilizzi Cloud Storage per l'archiviazione dei set di dati, potresti non trarre lo stesso vantaggio da TFRecords.
Panoramica delle conversioni
La cartella di classificazione delle immagini all'interno del repository del convertitore di dati
su GitHub contiene lo script converter
, image_classification_data.py
e un
implementazione di esempio, simple_example.py
, puoi copiarla e modificarla
la tua conversione dei dati.
Il Sample del convertitore di dati di classificazione delle immagini definisce due classi,
ImageClassificationConfig
e ImageClassificationBuilder
. Questi corsi sono
definito in tpu/tools/data_converter/image_classification_data.py
.
ImageClassificationConfig
è una classe base astratta. Sottoclassifica
ImageClassificationConfig
per definire la configurazione necessaria per creare un'istanza di
ImageClassificationBuilder
.
ImageClassificationBuilder
è un generatore di set di dati TensorFlow
per i set di dati di classificazione delle immagini. È una sottoclasse di tdfs.core.GeneratorBasedBuilder
.
Recupera esempi di dati dal set di dati e li converte in TFRecord. I
TFRecord vengono scritti in un percorso specificato dal parametro data_dir
al
metodo __init__
di ImageClassificationBuilder
.
In simple_example.py,
SimpleDatasetConfig
sottoclassi ImageClassificationConfig
, implementando
proprietà che definiscono le modalità supportate, il numero di classi di immagini e un
generatore di esempi che genera un dizionario contenente i dati delle immagini e una
classe di immagini per ogni esempio nel set di dati.
La funzione main()
crea un set di dati di dati immagine generati casualmente e
crea un'istanza di un oggetto SimpleDatasetConfig
specificando il numero di classi e
il percorso del set di dati su disco. Successivamente, main()
crea un'istanza
Oggetto ImageClassificationBuilder
, che passa in SimpleDatasetConfig
in esecuzione in un'istanza Compute Engine. Infine, main()
chiama download_and_prepare()
. Quando viene chiamato questo metodo, l'istanza ImageClassificationBuilder
utilizza il generatore di esempi di dati implementato da SimpleDatasetConfig
per caricare ogni esempio e salvarli in una serie di file TFRecord.
Per una spiegazione più dettagliata, consulta il notebook del convertitore di classificazione.
Modifica dell'esempio di conversione dei dati per caricare il set di dati
Per convertire il set di dati in formato TFRecord, sottoclasse
Classe ImageClassificationConfig
che definisce le seguenti proprietà:
- num_labels: restituisce il numero di classi immagine
- supported_modes: restituisce un elenco di modalità supportate dal set di dati (ad es. test, addestramento e convalida)
- text_label_map: restituisce un dizionario che modella la mappatura tra una un'etichetta di classe di testo e un'etichetta di classe con numeri interi (SimpleDatasetConfig non usa questa proprietà, non richiede una mappatura)
- download_path: il percorso da cui scaricare il set di dati (SimpleDatasetConfig non utilizza questa proprietà, example_generator carica i dati dal disco)
Implementa la funzione di generatore example_generator. Questo metodo deve restituire un
dizionario contenente i dati dell'immagine e il nome della classe dell'immagine per ogni esempio.
ImageClassificationBuilder
usa la funzione example_generator()
per recuperare
ad esempio e li scrive su disco in formato TFRecord.
Eseguire l'esempio di conversione dei dati
Crea un bucket Cloud Storage utilizzando il seguente comando:
gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=us-central2
Avvia una Cloud TPU utilizzando il comando
gcloud
.$ gcloud compute tpus tpu-vm create tpu-name \ --zone=us-central2-b \ --accelerator-type=v4-8 \ --version=tpu-vm-tf-2.17.0-pjrt
Descrizioni flag di comando
zone
- La zona in cui prevedi di creare la tua Cloud TPU.
accelerator-type
- Il tipo di acceleratore specifica la versione e le dimensioni della Cloud TPU che vuoi creare. Per ulteriori informazioni sui tipi di acceleratori supportati per ogni versione di TPU, consulta Versioni di TPU.
version
- La versione software di Cloud TPU.
Connettiti alla TPU tramite SSH:
$ gcloud compute tpus tpu-vm ssh tpu-name --zone=us-central2-b
Quando ti connetti alla TPU, il prompt della shell cambia da Da
username@projectname
ausername@vm-name
.Installa i pacchetti richiesti.
(vm)$ pip3 install opencv-python-headless pillow
Crea le seguenti variabili di ambiente utilizzate dallo script.
(vm)$ export STORAGE_BUCKET=gs://bucket-name (vm)$ export CONVERTED_DIR=$HOME/tfrecords (vm)$ export GENERATED_DATA=$HOME/data (vm)$ export GCS_CONVERTED=$STORAGE_BUCKET/data_converter/image_classification/tfrecords (vm)$ export GCS_RAW=$STORAGE_BUCKET/image_classification/raw (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
Passa alla directory
data_converter
.(vm)$ cd /usr/share/tpu/tools/data_converter
Eseguire il convertitore di dati su un set di dati falso
Lo script simple_example.py
si trova nella cartella image_classification
dell'esempio del convertitore di dati. L'esecuzione dello script con i seguenti parametri genera un insieme di immagini false e le converte in TFRecord.
(vm)$ python3 image_classification/simple_example.py \ --num_classes=1000 \ --data_path=$GENERATED_DATA \ --generate=True \ --num_examples_per_class_low=10 \ --num_examples_per_class_high=11 \ --save_dir=$CONVERTED_DIR
Eseguire il convertitore di dati su uno dei nostri set di dati non elaborati
Crea una variabile di ambiente per la località dei dati non elaborati.
(vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
Esegui lo script
simple_example.py
.(vm)$ python3 image_classification/simple_example.py \ --num_classes=1000 \ --data_path=$GCS_RAW \ --generate=False \ --save_dir=$CONVERTED_DIR
Lo script simple_example.py
accetta i seguenti parametri:
num_classes
si riferisce al numero di classi nel set di dati. Qui utilizziamo 1000 per adattarci al formato ImageNet.generate
determina se generare o meno i dati non elaborati.data_path
si riferisce al percorso in cui vengono generati i dati segenerate=True
o il percorso in cui sono archiviati i dati non elaborati, segenerate=False
.num_examples_per_class_low
enum_examples_per_class_high
determinano come molti esempi per classe da generare. Lo script genera un numero random di esempi in questo intervallo.save_dir
si riferisce alla posizione in cui vengono salvati i TFRecord salvati. Per addestrare un modello su Cloud TPU, i dati devono essere archiviati in Cloud Storage. Può essere su Cloud Storage o sulla VM.
Rinomina e sposta i TFRecord in Cloud Storage
Il seguente esempio utilizza i dati convertiti con il modello ResNet.
Rinomina i TFRecord nello stesso formato dei TFRecord di ImageNet:
(vm)$ cd $CONVERTED_DIR/image_classification_builder/Simple/0.1.0/ (vm)$ sudo apt install rename
(vm)$ rename -v 's/image_classification_builder-(\w+)\.tfrecord/$1/g' *
Copia i TFRecord in Cloud Storage:
(vm)$ gcloud storage cp train* $GCS_CONVERTED (vm)$ gcloud storage cp validation* $GCS_CONVERTED
Esegui la pulizia
Se non l'hai già fatto, scollega la Cloud TPU:
(vm)$ exit
Il tuo prompt dovrebbe ora essere
user@projectname
, a indicare che ti trovi in Cloud Shell.In Cloud Shell, esegui
gcloud
per eliminare la risorsa VM.$ gcloud compute tpus tpu-vm delete tpu-name \ --zone=us-central2-b
Verifica che la VM sia stata eliminata eseguendo
gcloud compute tpus tpu-vm list
. La l'eliminazione potrebbe richiedere diversi minuti. Una risposta simile alla seguente indica che le istanze sono state eliminate correttamente.$ gcloud compute tpus tpu-vm list --zone=us-central2-b
Listed 0 items.
Esegui gcloud CLI come mostrato, sostituendo bucket-name con il nome del bucket Cloud Storage che hai creato per questo tutorial:
$ gcloud storage rm gs://bucket-name --recursive