Konvertieren eines Bildklassifizierungs-Datasets zur Verwendung mit Cloud TPU
In dieser Anleitung wird beschrieben, wie Sie mit dem Skript Beispiel für die Konvertierung von Bildklassifizierungsdaten ein Rohformat zur Klassifizierung von Bildern in das TFRecord-Format konvertieren, das zum Trainieren von Cloud TPU-Modellen verwendet wird.
Mithilfe von TFRecords können große Dateien aus Cloud Storage effizienter gelesen werden, als wenn jedes Image als einzelne Datei gelesen wird. Sie können TFRecord überall dort verwenden, wo Sie eine tf.data.Dataset
-Pipeline verwenden.
Weitere Informationen zur Verwendung von TFRecord finden Sie in den folgenden TensorFlow-Dokumenten:
- TFRecord and tf.train.Example
- tf.data.Dataset
- tf.data: Build TensorFlow input pipelines
- PyTorch TFRecord reader and writer
Wenn Sie das PyTorch- oder JAX-Framework und nicht Cloud Storage verwenden für Ihren Dataset-Speicher haben, erhalten Sie mit TFRecords möglicherweise nicht denselben Vorteil.
Konvertierung – Übersicht
Der Bildklassifizierungsordner im Datenkonverter-Repository auf GitHub enthält das Skript converter
, image_classification_data.py
und die Beispielimplementierung simple_example.py
, die Sie kopieren und in Ihre eigene Datenkonvertierung anpassen können.
Das Beispiel für die Bildklassifikationsdaten-Konvertierung definiert zwei Klassen, ImageClassificationConfig
und ImageClassificationBuilder
. Diese Klassen sind in tpu/tools/data_converter/image_classification_data.py
definiert.
ImageClassificationConfig
ist eine einfache Basisklasse. Sie leiten die Unterklasse ImageClassificationConfig
ab, um die Konfiguration zu definieren, die zum Instanziieren von ImageClassificationBuilder
erforderlich ist.
ImageClassificationBuilder
ist ein TensorFlow-Dataset-Builder für Bildklassifizierungs-Datasets. Es ist eine abgeleitete Klasse von tdfs.core.GeneratorBasedBuilder
.
Es ruft Beispieldaten aus Ihrem Dataset ab und konvertiert sie in TFRecords. Die TFRecords werden in einen Pfad geschrieben, der durch den Parameter data_dir
zur Methode __init__
von ImageClassificationBuilder
angegeben wird.
In simple_example.py , SimpleDatasetConfig
erstellt eine Unterklasse von ImageClassificationConfig
, Implementieren von Eigenschaften, die die unterstützten Modi definieren, implementieren Anzahl von Bildklassen und ein Beispielgenerator, der ein Wörterbuch mit Bilddaten und eine Bildklasse für jedes Beispiel im Dataset hervorbringt.
Die Funktion main()
erstellt ein Dataset mit zufällig generierten Bilddaten und instanziiert ein SimpleDatasetConfig
- Objekt, das die Anzahl der Klassen und den Pfad zum Dataset auf der Festplatte angibt. Als Nächstes instanziiert main()
ein Objekt ImageClassificationBuilder
und übergibt die Instanz SimpleDatasetConfig
. Schließlich ruft main()
download_and_prepare()
auf. Wenn diese Methode aufgerufen wird, verwendet die ImageClassificationBuilder
-Instanz den von SimpleDatasetConfig
implementierten Beispielgenerator für Daten, um jedes Beispiel zu laden und in einer Reihe von TFRecord-Dateien zu speichern.
Eine ausführliche Erläuterung finden Sie in der Klassifizierungskonverter-Notebook.
Datenkonvertierungsbeispiel ändern, um das Dataset zu laden
Um Ihr Dataset in das TFRecord-Format zu konvertieren, erstellen Sie eine Unterklasse der Klasse ImageClassificationConfig
, die die folgenden Eigenschaften definiert:
- „num_labels“: Gibt die Anzahl der Bildklassen zurück.
- supported_modes: Gibt eine Liste der Modi zurück, die von Ihrem Dataset unterstützt werden (z. B. testen, trainieren und validieren).
- text_label_map: gibt ein Wörterbuch zurück, das die Zuordnung zwischen einem „text_class_label“ und ein ganzzahliges Klassenlabel (SimpleDatasetConfig verwendet dieses Attribut nicht, da Eine Zuordnung ist nicht erforderlich.)
- download_path: Pfad, von dem das Dataset heruntergeladen werden soll (SimpleDatasetConfig verwendet dieses Attribut nicht, das Attribut example_generator lädt die Daten von der Festplatte.)
Implementieren Sie die example_generator-Generatorfunktion. Diese Methode muss ein Wörterbuch mit den Bilddaten und dem Namen der Bildklasse für jedes Beispiel liefern.
ImageClassificationBuilder
verwendet die Funktion example_generator()
, um jedes Beispiel abzurufen und im TFRecord-Format auf die Festplatte zu schreiben.
Das Daten-konvertierungs-Beispiel wird ausgeführt
Erstellen Sie mit dem folgenden Befehl einen Cloud Storage-Bucket:
gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=us-central2
Starten Sie eine Cloud TPU mit dem Befehl
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
Beschreibung der Befehls-Flags
zone
- Die Zone, in der Sie die Cloud TPU erstellen möchten.
accelerator-type
- Mit dem Beschleunigertyp geben Sie die Version und Größe der Cloud TPU an, die Sie erstellen möchten. Weitere Informationen zu den unterstützten Beschleunigertypen für jede TPU-Version finden Sie unter TPU-Versionen.
version
- Die Cloud TPU-Softwareversion.
Stellen Sie eine SSH-Verbindung zur TPU her:
$ gcloud compute tpus tpu-vm ssh tpu-name --zone=us-central2-b
Wenn Sie eine Verbindung zur TPU herstellen, ändert sich die Shell-Eingabeaufforderung von
username@projectname
inusername@vm-name
.Erforderliche Pakete installieren
(vm)$ pip3 install opencv-python-headless pillow
Erstellen Sie die folgenden vom Skript verwendeten Umgebungsvariablen.
(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"
Wechseln Sie zum Verzeichnis
data_converter
.(vm)$ cd /usr/share/tpu/tools/data_converter
Datenkonverter für ein künstliches Dataset ausführen
Das Skript simple_example.py
befindet sich im Ordner image_classification
des Datenkonverter-Beispiels. Wenn Sie das Skript mit den folgenden Parametern ausführen, wird ein Satz gefälschter Bilder generiert und in TFRecords konvertiert.
(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
Datenkonverter für eines unserer Rohdatasets ausführen
Erstellen Sie eine Umgebungsvariable für den Speicherort der Rohdaten.
(vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
Führen Sie das Skript
simple_example.py
aus:(vm)$ python3 image_classification/simple_example.py \ --num_classes=1000 \ --data_path=$GCS_RAW \ --generate=False \ --save_dir=$CONVERTED_DIR
Das Skript simple_example.py
verwendet die folgenden Parameter:
num_classes
bezieht sich auf die Anzahl der Klassen im Dataset. Wir verwenden hier 1000, um dem ImageNet-Format zu entsprechen.generate
bestimmt, ob die Rohdaten generiert werden sollen.data_path
bezieht sich auf den Pfad, in dem die Daten generiert werden, wenngenerate=True
, oder den Pfad, in dem die Rohdaten gespeichert werden, wenngenerate=False
.num_examples_per_class_low
undnum_examples_per_class_high
bestimmen, wie viele Beispiele pro Klasse generiert werden sollen. Das Skript generiert eine zufällige Anzahl von Beispielen in diesem Bereich.save_dir
bezieht sich darauf, wo TFRecords gespeichert sind. Zum Trainieren eines Modells in Cloud TPU müssen die Daten in Cloud Storage gespeichert werden. Dies kann in Cloud Storage oder auf der VM geschehen.
TFRecords umbenennen und in Cloud Storage verschieben
Im folgenden Beispiel werden die konvertierten Daten mit dem ResNet-Modell verwendet.
Benennen Sie die TFRecords in dasselbe Format wie ImageNet TFRecords um:
(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' *
Kopieren Sie die TFRecords in Cloud Storage:
(vm)$ gcloud storage cp train* $GCS_CONVERTED (vm)$ gcloud storage cp validation* $GCS_CONVERTED
Bereinigen
Trennen Sie die Verbindung zur Cloud TPU, sofern noch nicht geschehen:
(vm)$ exit
Die Eingabeaufforderung sollte nun
user@projectname
lauten und angeben, dass Sie sich in Cloud Shell befinden.Führen Sie in Cloud Shell
gcloud
aus, um die VM-Ressource zu löschen.$ gcloud compute tpus tpu-vm delete tpu-name \ --zone=us-central2-b
Prüfen Sie, ob die VM gelöscht wurde. Führen Sie dazu
gcloud compute tpus tpu-vm list
aus. Der Löschvorgang kann einige Minuten dauern. Eine Antwort wie die folgende gibt an, dass Ihre Instanzen erfolgreich gelöscht wurden.$ gcloud compute tpus tpu-vm list --zone=us-central2-b
Listed 0 items.
Führen Sie die gcloud CLI wie gezeigt aus und ersetzen Sie bucket-name durch Name des Cloud Storage-Bucket, den Sie für diese Anleitung erstellt haben:
$ gcloud storage rm gs://bucket-name --recursive