Convertir un conjunto de datos de clasificación de imágenes para utilizarlo con TPU de Cloud
En este tutorial se describe cómo usar la muestra 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 TPU de Cloud.
Los TFRecords hacen que la lectura de archivos grandes de Cloud Storage sea más eficiente que la lectura de cada imagen como un archivo individual. Puedes usar TFRecord en cualquier lugar donde utilices una
tf.data.Dataset
.
Consulta los siguientes documentos de TensorFlow para obtener más información sobre cómo usar TFRecord:
- TFRecord y tf.train.Example
- tf.data.Dataset
- tf.data: crea flujos de entrada de TensorFlow
- Lector y escritor de TFRecord de PyTorch
Si usas el framework PyTorch o JAX y no utilizas Cloud Storage para almacenar tu conjunto de datos, es posible que no obtengas las mismas ventajas de TFRecords.
Resumen de conversiones
La carpeta de clasificación de imágenes del repositorio del convertidor de datos
en GitHub contiene la secuencia de comandos converter
, image_classification_data.py
y una
implementación de ejemplo, simple_example.py
, que puedes copiar y modificar para hacer
tu propia conversión de datos.
El ejemplo de convertidor de datos de clasificación de imágenes define dos clases: ImageClassificationConfig
y ImageClassificationBuilder
. Estas clases se definen en tpu/tools/data_converter/image_classification_data.py
.
ImageClassificationConfig
es una clase base abstracta. Subclases ImageClassificationConfig
para definir la configuración necesaria para crear una instancia de ImageClassificationBuilder
.
ImageClassificationBuilder
es un generador 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 especificada por el parámetro data_dir
del método __init__
de ImageClassificationBuilder
.
En simple_example.py, SimpleDatasetConfig
subclases ImageClassificationConfig
, implementando propiedades que definen los modos admitidos, el número 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 aleatoriamente e instancia un objeto SimpleDatasetConfig
que especifica el número de clases y la ruta al conjunto de datos en el disco. A continuación, main()
crea una instancia de un objeto ImageClassificationBuilder
y le transfiere la instancia de SimpleDatasetConfig
. Por último, main()
llama a download_and_prepare()
. Cuando se llama a este método, la instancia ImageClassificationBuilder
usa el generador de ejemplos de datos implementado por SimpleDatasetConfig
para cargar cada ejemplo y guardarlos en una serie de archivos TFRecord.
Para obtener una explicación más detallada, consulta el notebook Classification Converter.
Modificar la muestra de conversión de datos para cargar el conjunto de datos
Para convertir tu conjunto de datos al formato TFRecord, crea una subclase de la clase ImageClassificationConfig
que defina las siguientes propiedades:
- num_labels: devuelve el número de clases de imágenes
- supported_modes: devuelve una lista de los modos admitidos por tu conjunto de datos (por ejemplo, test, train y validate).
- text_label_map: devuelve un diccionario que modela la asignación entre una etiqueta de clase de texto y una etiqueta de clase de número entero (SimpleDatasetConfig no usa esta propiedad porque no requiere una asignación).
- download_path: la ruta desde la que se descargará el conjunto de datos. (SimpleDatasetConfig no usa esta propiedad, el example_generator carga los datos del disco).
Implementa la función de generador example_generator. Este método debe generar un diccionario que contenga los datos de la imagen y el nombre de la clase de imagen de cada ejemplo.
ImageClassificationBuilder
usa la función example_generator()
para obtener cada ejemplo y escribirlo en el disco en formato TFRecord.
Ejecutar la muestra de conversión de datos
Crea un segmento de Cloud Storage con el siguiente comando:
gcloud storage buckets create gs://bucket-name --project=your-project-id --location=us-central2
Inicia una TPU de Cloud 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.1-pjrt
Descripciones de marcas de comandos
zone
- La zona en la que tienes previsto crear tu TPU de Cloud.
accelerator-type
- El tipo de acelerador especifica la versión y el tamaño de la TPU de Cloud que quieres 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 la TPU de Cloud.
Conéctate a la TPU mediante SSH:
$ gcloud compute tpus tpu-vm ssh tpu-name --zone=us-central2-b
Cuando te conectes a la TPU, la petición de shell cambiará de
username@projectname
ausername@vm-name
.Instala los paquetes necesarios.
(vm)$ pip3 install opencv-python-headless pillow (vm)$ pip3 install tensorflow-datasets
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"
Descarga el repositorio de TensorFlow TPU.
(vm)$ cd /usr/share/ (vm)$ git clone https://github.com/tensorflow/tpu.git (vm)$ cd tpu/tools/data_converter
Ejecutar el convertidor de datos en un conjunto de datos falso
La secuencia de comandos simple_example.py
se encuentra en la carpeta image_classification
del ejemplo de convertidor de datos. Al ejecutar la secuencia de comandos con los siguientes parámetros, se genera un conjunto de imágenes falsas y se convierten 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
Ejecutar 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
usa los siguientes parámetros:
num_classes
hace referencia al número de clases del conjunto de datos. Aquí usamos 1000 para que coincida con el formato de ImageNet.generate
determina si se generan los datos sin procesar.data_path
hace referencia a la ruta en la que se generan los datos sigenerate=True
o a la ruta en la que se almacenan los datos sin procesar sigenerate=False
.num_examples_per_class_low
ynum_examples_per_class_high
determinan cuántos ejemplos por clase se van a generar. La secuencia de comandos genera un número aleatorio de ejemplos en este intervalo.save_dir
hace referencia a la ubicación donde se guardan los TFRecords. Para entrenar un modelo en Cloud TPU, los datos deben almacenarse en Cloud Storage. Puede estar en Cloud Storage o en la VM.
Cambiar el nombre de los TFRecords y moverlos 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 update (vm)$ sudo apt install rename
(vm)$ rename -v 's/image_classification_builder-(\w+)\.tfrecord/$1/g' *
Copia los TFRecords en Cloud Storage:
(vm)$ gcloud storage cp train* $GCS_CONVERTED (vm)$ gcloud storage cp validation* $GCS_CONVERTED
Limpieza
Desconéctate de la TPU de Cloud, si aún no lo has hecho:
(vm)$ exit
A continuación, se mostrará el mensaje
user@projectname
, que indica que estás en Cloud Shell.En Cloud Shell, ejecuta
gcloud
para eliminar el recurso de VM.$ gcloud compute tpus tpu-vm delete tpu-name \ --zone=us-central2-b
Para comprobar que la máquina virtual se ha eliminado, ejecuta
gcloud compute tpus tpu-vm list
. El proceso de eliminación puede tardar varios minutos. Una respuesta como la siguiente indica que las instancias se han eliminado correctamente.$ gcloud compute tpus tpu-vm list --zone=us-central2-b
Listed 0 items.
Ejecuta la CLI de gcloud tal y como se muestra en este paso para sustituir bucket-name por el nombre del segmento de Cloud Storage que has creado en este tutorial:
$ gcloud storage rm gs://bucket-name --recursive