Convierte un conjunto de datos de clasificación de imágenes para usarlo con Cloud TPU
En este instructivo, se describe cómo usar la secuencia de comandos de ejemplo del convertidor de datos de clasificación de imágenes para convertir un conjunto de datos de clasificación de imágenes sin procesar al formato TFRecord que se usa para entrenar modelos de Cloud TPU.
Los TFRecord hacen que la lectura de archivos grandes desde Cloud Storage sea más eficiente que leer cada imagen como un archivo individual. Puedes usar TFRecord en cualquier lugar en el que uses una canalización tf.data.Dataset
.
Consulta los siguientes documentos de TensorFlow para obtener más información sobre el uso de TFRecord:
- TFRecord y tf.train.Example
- tf.data.Dataset
- tf.data: compila canalizaciones de entrada de TensorFlow
- Lector y escritor de PyTorch TFRecord
Si usas el framework de PyTorch o JAX y no usas Cloud Storage para el almacenamiento de tu conjunto de datos, es posible que no obtengas la misma ventaja de TFRecords.
Descripción general de conversiones
La carpeta de clasificación de imágenes dentro del repositorio del convertidor de datos en GitHub contiene la secuencia de comandos converter
, image_classification_data.py
y una implementación de muestra, simple_example.py
, que puedes copiar y modificar para hacer tu propia conversión de datos.
En el ejemplo del convertidor de datos de clasificación de imágenes, se definen dos clases: ImageClassificationConfig
y ImageClassificationBuilder
. Estas clases se definen en tpu/tools/data_converter/image_classification_data.py
.
ImageClassificationConfig
es una clase base abstracta. Puedes subclasificar
ImageClassificationConfig
para definir la configuración necesaria y crear una instancia
ImageClassificationBuilder
ImageClassificationBuilder
es un compilador de conjuntos de datos de TensorFlow
para conjuntos de datos
de clasificación de imágenes. Es una subclase de tdfs.core.GeneratorBasedBuilder
.
Recupera ejemplos de datos de tu conjunto de datos y los convierte en TFRecords. Los TFRecords se escriben en una ruta de acceso especificada por el parámetro data_dir
al método __init__
de ImageClassificationBuilder
.
En simple_example.py, SimpleDatasetConfig
subclasifica a ImageClassificationConfig
, implementando propiedades que definen los modos admitidos, la cantidad de clases de imagen y un generador de ejemplos que produce un diccionario que contiene datos de imagen y una clase de imagen para cada ejemplo del conjunto de datos.
La función main()
crea un conjunto de datos de imágenes generadas de forma aleatoria y crea una instancia de un objeto SimpleDatasetConfig
que especifica la cantidad de clases y la ruta de acceso al conjunto de datos en el disco. A continuación, main()
crea una instancia de
ImageClassificationBuilder
, pasa el objeto SimpleDatasetConfig
instancia. Por último, main()
llama a download_and_prepare()
. Cuando se llama a este método, la instancia de ImageClassificationBuilder
usa el generador de ejemplos de datos que implementa SimpleDatasetConfig
para cargar cada ejemplo y guardarlos en una serie de archivos TFRecord.
Para obtener una explicación más detallada, consulta la Notebook del convertidor de clasificación.
Modifica la muestra de conversión de datos para cargar tu conjunto de datos
Para convertir tu conjunto de datos en formato TFRecord, crea una subclase de la
La clase ImageClassificationConfig
que define las siguientes propiedades:
- num_labels: Muestra la cantidad de clases de imágenes.
- supported_modes: Muestra una lista de modos compatibles con tu conjunto de datos (por ejemplo: probar, entrenar y validar)
- text_label_map: Muestra un diccionario que modela la asignación entre una etiqueta de clase de texto y una de clase de número entero (SimpleDatasetConfig no usa esta propiedad porque no requiere una asignación).
- ruta_descarga: la ruta de acceso desde la que se descarga tu conjunto de datos (SimpleDatasetConfig no usa esta propiedad, ya que example_generator carga los datos desde el disco).
Implementa la función de generación example_generator. Este método debe generar un
diccionario que contiene los datos de la imagen y el nombre de la clase de imagen para cada ejemplo.
ImageClassificationBuilder
usa la función example_generator()
para recuperar cada ejemplo y escribirlo en el disco en formato TFRecord.
Cómo ejecutar la muestra de conversión de datos
Crea un bucket de Cloud Storage con el siguiente comando:
gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=us-central2
Inicia una Cloud TPU con el 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
Descripciones de las marcas de comandos
zone
- Es la zona en la que deseas crear la Cloud TPU.
accelerator-type
- El tipo de acelerador especifica la versión y el tamaño de la Cloud TPU que deseas crear. Para obtener más información sobre los tipos de aceleradores compatibles con cada versión de TPU, consulta Versiones de TPU.
version
- La versión de software de Cloud TPU.
Conéctate a la TPU con SSH:
$ gcloud compute tpus tpu-vm ssh tpu-name --zone=us-central2-b
Cuando te conectas a la TPU, el indicador de shell cambia de
username@projectname
ausername@vm-name
.Instala los paquetes obligatorios.
(vm)$ pip3 install opencv-python-headless pillow
Crea las siguientes variables de entorno que usa la secuencia de comandos.
(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"
Cambia al directorio
data_converter
.(vm)$ cd /usr/share/tpu/tools/data_converter
Ejecuta el convertidor de datos en un conjunto de datos falso
La secuencia de comandos simple_example.py
se encuentra en image_classification
de la muestra del convertidor de datos. Ejecuta la secuencia de comandos con lo siguiente
genera un conjunto de imágenes falsas y las convierte en TFRecords.
(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
Ejecuta el convertidor de datos en uno de nuestros conjuntos de datos sin procesar
Crea una variable de entorno para la ubicación de los datos sin procesar.
(vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
Ejecuta la secuencia de comandos
simple_example.py
:(vm)$ python3 image_classification/simple_example.py \ --num_classes=1000 \ --data_path=$GCS_RAW \ --generate=False \ --save_dir=$CONVERTED_DIR
La secuencia de comandos simple_example.py
toma los siguientes parámetros:
num_classes
se refiere a la cantidad de clases en el conjunto de datos. Aquí, usamos 1,000 para que coincida con el formato de ImageNet.generate
determina si se deben generar o no los datos sin procesar.data_path
se refiere a la ruta en la que se deben generar los datos si el valor esgenerate=True
o la ruta en la que se almacenan los datos sin procesar si el valor esgenerate=False
.num_examples_per_class_low
ynum_examples_per_class_high
determinan cuántos ejemplos por clase se deben generar. La secuencia de comandos genera un número al azar de ejemplos en este rango.save_dir
hace referencia a la ubicación en la que se guardan los TFRecords guardados. Con el fin de entrenar un modelo en Cloud TPU, los datos deben almacenarse en Cloud Storage. Puede ser en Cloud Storage o en la VM.
Cambia el nombre y mueve los TFRecords a Cloud Storage
En el siguiente ejemplo, se usan los datos convertidos con el modelo ResNet.
Cambia el nombre de los TFRecords al mismo formato que los TFRecords de 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 los TFRecords a Cloud Storage:
(vm)$ gcloud storage cp train* $GCS_CONVERTED (vm)$ gcloud storage cp validation* $GCS_CONVERTED
Limpia
Desconéctate de Cloud TPU, si aún no lo hiciste hazlo:
(vm)$ exit
El mensaje ahora debería mostrar
user@projectname
, que indica que estás en Cloud Shell.En Cloud Shell, ejecuta
gcloud
para borrar el recurso de VM.$ gcloud compute tpus tpu-vm delete tpu-name \ --zone=us-central2-b
Ejecuta
gcloud compute tpus tpu-vm list
para verificar que se haya borrado la VM. La eliminación puede tardar varios minutos. Una respuesta como la que se muestra a continuación indica que tus instancias se borraron de forma correcta.$ gcloud compute tpus tpu-vm list --zone=us-central2-b
Listed 0 items.
Ejecuta la CLI de gcloud como se muestra y reemplaza bucket-name por el nombre del bucket de Cloud Storage que creaste para este instructivo:
$ gcloud storage rm gs://bucket-name --recursive