Conversione di un set di dati di classificazione delle immagini da utilizzare con Cloud TPU
Questo tutorial descrive come utilizzare lo script di esempio del convertitore di dati di classificazione delle immagini per convertire un set di dati di classificazione delle immagini non elaborato nel formato TFRecord utilizzato per addestrare i modelli Cloud TPU.
I TFRecord rendono
la lettura di file di grandi dimensioni da Cloud Storage più efficiente rispetto alla lettura di ogni
immagine come file individuale. Puoi utilizzare TFRecord ovunque utilizzi una pipeline
tf.data.Dataset.
Per saperne di più sull'utilizzo di TFRecord, consulta i seguenti documenti di TensorFlow:
- TFRecord e tf.train.Example
- tf.data.Dataset
- tf.data: creare pipeline di input con TensorFlow
- Lettore e writer TFRecord PyTorch
Se utilizzi il framework PyTorch o JAX e non utilizzi Cloud Storage per l'archiviazione del set di dati, potresti non ottenere lo stesso vantaggio da TFRecord.
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, che puoi copiare e modificare per eseguire la conversione dei tuoi dati.
L'esempio di convertitore di dati per la classificazione delle immagini definisce due classi,
ImageClassificationConfig e ImageClassificationBuilder. Queste classi sono
definite in tpu/tools/data_converter/image_classification_data.py.
ImageClassificationConfig è una classe base astratta. Esegui la sottoclasse
ImageClassificationConfig per definire la configurazione necessaria per creare un'istanza di
ImageClassificationBuilder.
ImageClassificationBuilder è uno strumento di creazione 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 tuo 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 produce 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 di immagini generati in modo casuale e
crea un'istanza di un oggetto SimpleDatasetConfig che specifica il numero di classi e
il percorso del set di dati sul disco. Successivamente, main() crea un'istanza dell'oggetto ImageClassificationBuilder, passando l'istanza SimpleDatasetConfig. 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 li salva in una serie di file TFRecord.
Per una spiegazione più dettagliata, consulta il notebook di conversione della classificazione.
Modifica dell'esempio di conversione dei dati per caricare il set di dati
Per convertire il set di dati nel formato TFRecord, crea una sottoclasse della
classe ImageClassificationConfig definendo le seguenti proprietà:
- num_labels: restituisce il numero di classi di immagini
- supported_modes: restituisce un elenco delle modalità supportate dal set di dati (ad esempio: test, addestramento e convalida)
- text_label_map: restituisce un dizionario che modella la mappatura tra un'etichetta di classe di testo e un'etichetta di classe intera (SimpleDatasetConfig non utilizza questa proprietà perché non richiede una mappatura)
- download_path: il percorso da cui scaricare il set di dati (SimpleDatasetConfig non utilizza questa proprietà, l'esempio example_generator carica i dati dal disco)
Implementa la funzione generatore example_generator. Questo metodo deve produrre un dizionario contenente i dati dell'immagine e il nome della classe dell'immagine per ogni esempio.
ImageClassificationBuilder utilizza la funzione example_generator() per recuperare
ogni esempio e li scrive su disco in formato TFRecord.
Esecuzione dell'esempio di conversione dei dati
Crea un bucket Cloud Storage utilizzando il seguente comando:
gcloud storage buckets create gs://bucket-name --project=your-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.1-pjrt
Descrizioni dei flag dei comandi
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 maggiori informazioni sui tipi di acceleratore supportati per ogni versione di TPU, consulta la sezione Versioni di TPU.
version- La versione software di Cloud TPU.
Connettiti alla TPU utilizzando SSH:
$ gcloud compute tpus tpu-vm ssh tpu-name --zone=us-central2-b
Quando ti connetti alla TPU, il prompt della shell cambia da
username@projectnameausername@vm-name.Installa i pacchetti richiesti.
(vm)$ pip3 install opencv-python-headless pillow (vm)$ pip3 install tensorflow-datasets
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"
Scarica il repository TensorFlow TPU.
(vm)$ cd /usr/share/ (vm)$ git clone https://github.com/tensorflow/tpu.git (vm)$ cd tpu/tools/data_converter
Esecuzione del convertitore di dati su un set di dati fittizio
Lo script simple_example.py si trova nella cartella image_classification
dell'esempio di 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
Esecuzione del convertitore di dati su uno dei nostri set di dati non elaborati
Crea una variabile di ambiente per la posizione 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_classessi riferisce al numero di classi nel set di dati. Qui utilizziamo 1000 per corrispondere al formato ImageNet.generatedetermina se generare o meno i dati non elaborati.data_pathsi riferisce al percorso in cui vengono generati i dati segenerate=Trueo al percorso in cui vengono archiviati i dati non elaborati segenerate=False.num_examples_per_class_lowenum_examples_per_class_highdeterminano il numero di esempi per classe da generare. Lo script genera un numero casuale di esempi in questo intervallo.save_dirsi riferisce alla posizione in cui vengono salvati i TFRecord salvati. Per addestrare un modello su Cloud TPU, i dati devono essere archiviati su Cloud Storage. Può trovarsi in Cloud Storage o nella VM.
Rinomina e sposta i TFRecord in Cloud Storage
L'esempio seguente utilizza i dati convertiti con il modello ResNet.
Rinomina i TFRecord nello stesso formato dei TFRecord ImageNet:
(vm)$ cd $CONVERTED_DIR/image_classification_builder/Simple/0.1.0/ (vm)$ sudo apt update (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
Disconnettiti dalla Cloud TPU, se non l'hai già fatto:
(vm)$ exit
Il tuo prompt dovrebbe ora essere
user@projectname, a indicare che ti trovi in Cloud Shell.In Cloud Shell, esegui
gcloudper 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. 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 creato per questo tutorial:
$ gcloud storage rm gs://bucket-name --recursive