Realizar entrenamiento con el algoritmo de clasificación de imágenes integrado

El entrenamiento mediante algoritmos integrados en AI Platform Training te permite enviar el conjunto de datos y entrenar un modelo sin escribir ningún código de entrenamiento. En esta página, se explica cómo funciona el algoritmo integrado de clasificación de imágenes y cómo usarlo.

Descripción general

El algoritmo integrado de clasificación de imágenes usa tus conjuntos de datos de entrenamiento y validación a fin de entrenar modelos de forma continua y, luego, muestra el modelo guardado más preciso que se generó durante el trabajo de entrenamiento. También puedes usar el ajuste de hiperparámetros para lograr la mejor exactitud del modelo. El modelo guardado que se exportó se puede usar directamente en la predicción, ya sea de forma local o mediante su implementación en AI Platform Prediction para el servicio de producción.

Limitaciones

Los algoritmos integrados de imagen admiten el entrenamiento con CPU, GPU o TPU únicas. El modelo guardado resultante es compatible con la deriva en CPU y GPU.

Las siguientes funciones no son compatibles con el algoritmo integrado de clasificación de imágenes:

Tipos de máquina admitidos

Se admiten los siguientes niveles de escala y tipos de máquinas de AI Platform Training:

Autoriza a Cloud TPU para que tenga acceso al proyecto

Da formato a los datos de entrada para el entrenamiento

El algoritmo integrado de clasificación de imágenes requiere que los datos de entrada tengan el formato tf.Examples y que se guarden en archivos TFRecord. La estructura de datos tf.Example y el formato de archivo TFRecord están diseñados para la lectura eficiente de datos con TensorFlow.

El formato TFRecord es un formato simple para almacenar una secuencia de registros binarios. En este caso, todos los registros contienen representaciones binarias de imágenes. Cada imagen, junto con sus etiquetas de clase, se representa como tf.Example. Puedes guardar muchos tf.Example en un solo archivo TFRecord. También puedes fragmentar un conjunto de datos grande entre varios archivos TFRecord.

Obtén más información sobre TFRecord y tf.Example.

Convierte tus imágenes a TFRecords

TensorFlow proporciona una secuencia de comandos que puedes usar para convertir las imágenes de formato JPEG a TFRecord.

Puedes usar la secuencia de comandos si se cumplen estas condiciones:

  • Almacenas las imágenes en Cloud Storage.
  • Tienes archivos CSV con las rutas de acceso a las imágenes en Cloud Storage y sus etiquetas correspondientes. Por ejemplo:

    gs://cloud-ml-data/img/flower_photos/daisy/754296579_30a9ae018c_n.jpg,daisy
    gs://cloud-ml-data/img/flower_photos/dandelion/18089878729_907ed2c7cd_m.jpg,dandelion
    
  • Almacenas estos archivos CSV en Cloud Storage.

En el siguiente ejemplo, se muestra cómo ejecutar la secuencia de comandos:

  1. Descarga la secuencia de comandos:

    curl https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/jpeg_to_tf_record.py > ./jpeg_to_tf_record.py
    
  2. Establece las variables para el ID del proyecto y el nombre del bucket, si aún no lo hiciste:

    PROJECT_ID="YOUR_PROJECT_ID"
    BUCKET_NAME="YOUR_BUCKET_NAME"
    
  3. Crea una lista de todas las etiquetas posibles para el conjunto de datos en un archivo temporal:

    cat << EOF > /tmp/labels.txt
    daisy
    dandelion
    roses
    sunflowers
    tulips
    EOF
    
  4. Ejecuta la secuencia de comandos con los datos de flores del depósito cloud-ml-data público y la lista de etiquetas:

    python -m jpeg_to_tf_record.py \
           --train_csv gs://cloud-ml-data/img/flower_photos/train_set.csv \
           --validation_csv gs://cloud-ml-data/img/flower_photos/eval_set.csv \
           --labels_file /tmp/labels.txt \
           --project_id $PROJECT_ID \
           --output_dir gs://$BUCKET_NAME/flowers_as_tf_record
    

Verifica los permisos del bucket de Cloud Storage

A fin de almacenar tus datos, usa un bucket de Cloud Storage en el mismo proyecto de Google Cloud que usas para ejecutar trabajos de AI Platform Training. De lo contrario, otorga acceso a AI Platform Training al depósito de Cloud Storage en el que se almacenan tus datos.

Formato de entrada requerido

Para entrenar mediante el algoritmo integrado de clasificación de imágenes, los datos de imagen deben estructurarse como tf.Example, que incluyen los siguientes campos:

  • image/encoded es la string de imagen sin formato.

  • image/class/label es una sola etiqueta de número entero para la imagen correspondiente. No se admiten varias etiquetas por instancia.

    El conjunto de etiquetas de números enteros que se usa para el conjunto de datos debe ser una secuencia consecutiva que comience en 1. Por ejemplo, si tu conjunto de datos tiene cinco clases, cada etiqueta debe ser un número entero en el intervalo [1, 5].

Por ejemplo:

{
    'image/encoded': '<encoded image data>',
    'image/class/label': 2
}

Obtén el mejor modelo guardado como resultado

Cuando finaliza el trabajo de entrenamiento, AI Platform Training escribe un modelo guardado de TensorFlow en el depósito de Cloud Storage que especificaste como jobDir cuando enviaste el trabajo. El modelo guardado se escribe en jobDir/model. Por ejemplo, si envías el trabajo a gs://your-bucket-name/your-job-dir, AI Platform Training escribe el modelo guardado en gs://your-bucket-name/your-job-dir/model.

Si habilitaste el ajuste de hiperparámetros, AI Platform Training muestra el modelo guardado de TensorFlow con la mayor exactitud que se obtuvo durante el proceso de entrenamiento. Por ejemplo, si enviaste un trabajo de entrenamiento con 2,500 pasos de entrenamiento y la mayor exactitud se produjo a los 2,000 pasos, se obtiene un modelo guardado de TensorFlow de ese punto en particular.

Cada prueba de AI Platform Training escribe el modelo guardado de TensorFlow con la mayor exactitud en su propio directorio dentro del bucket de Cloud Storage. Por ejemplo, gs://your-bucket-name/your-job-dir/model/trial_{trial_id}.

La firma del resultado del modelo guardado es la siguiente:

signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['image_bytes'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: Placeholder:0
    inputs['key'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: key:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['classes'] tensor_info:
        dtype: DT_INT64
        shape: (-1)
        name: ArgMax:0
    outputs['key'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: Identity:0
    outputs['probabilities'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 1000)
        name: softmax_tensor:0
  Method name is: tensorflow/serving/predict

Datos de entrada:

  • image_bytes: Los bytes de imagen sin formato (no decodificados). Esto es lo mismo que image/encoded almacenado en tf.Example.
  • key: Es el identificador de valor de la string del resultado de la predicción. Este valor se envía a la key del resultado. En la predicción por lotes, esto ayuda a vincular el resultado de la predicción con la entrada.

Resultados:

  • classes: La etiqueta de clase prevista (número entero), que es la que tiene la probabilidad más alta
  • key: La clave de resultado
  • probabilities: La probability (entre 0 y 1) para cada class (de 0 a num_classes)

El siguiente es un ejemplo de entradas y resultados de predicción:

prediction_input: {
  'image_bytes': 'some_raw_image_bytes',
  'key': ['test_key'])
}

prediction_output: {
  'probabilities': [[0.1, 0.3, 0.6]],
  'classes': [2],
  'key': ['test_key'],
}

Configuración de ejemplo

Si envías un trabajo mediante gcloud, debes crear un archivo config.yaml para las especificaciones de ajuste de hiperparámetros y tipo de máquina. Si usas la consola de Google Cloud, no es necesario que crees este archivo. Obtén información sobre cómo enviar un trabajo de entrenamiento.

En el siguiente archivo config.yaml de ejemplo, se muestra cómo asignar recursos TPU para el trabajo de entrenamiento:

cat << EOF > config.yaml
trainingInput:
  # Use a cluster with many workers and a few parameter servers.
  scaleTier: CUSTOM
  masterType: n1-highmem-16
  masterConfig:
    imageUri: gcr.io/cloud-ml-algos/image_classification:latest
  workerType:  cloud_tpu
  workerConfig:
   imageUri: gcr.io/cloud-ml-algos/image_classification:latest
   acceleratorConfig:
     type: TPU_V2
     count: 8
  workerCount: 1
EOF

Luego usa el archivo config.yaml para enviar un trabajo de entrenamiento.

Configuración del ajuste de hiperparámetros

Para usar el ajuste de hiperparámetros, incluye la configuración en el mismo archivo config.yaml que la configuración de la máquina.

Puedes encontrar explicaciones breves de cada hiperparámetro en de la consola de Google Cloud y una explicación más completa en la referencia para el algoritmo integrado de clasificación de imágenes.

En el siguiente archivo config.yaml de ejemplo, se muestra cómo asignar recursos TPU para el trabajo de entrenamiento y, además, se incluye la configuración del ajuste de hiperparámetros:

cat << EOF > config.yaml
trainingInput:
  # Use a cluster with many workers and a few parameter servers.
  scaleTier: CUSTOM
  masterType: n1-highmem-16
  masterConfig:
    imageUri: gcr.io/cloud-ml-algos/image_classification:latest
  workerType:  cloud_tpu
  workerConfig:
   imageUri: gcr.io/cloud-ml-algos/image_classification:latest
   tpuTfVersion: 1.14
   acceleratorConfig:
     type: TPU_V2
     count: 8
  workerCount: 1
  # The following are hyperparameter configs.
  hyperparameters:
   goal: MAXIMIZE
   hyperparameterMetricTag: top_1_accuracy
   maxTrials: 6
   maxParallelTrials: 3
   enableTrialEarlyStopping: True
   params:
   - parameterName: initial_learning_rate
     type: DOUBLE
     minValue: 0.001
     maxValue: 0.2
     scaleType: UNIT_LOG_SCALE
EOF

Envía un trabajo de entrenamiento de clasificación de imágenes

En esta sección, se explica cómo enviar un trabajo de entrenamiento mediante el algoritmo integrado de clasificación de imágenes.

Console

Selecciona tu algoritmo

  1. Ve a la página Trabajos de AI Platform Training en la consola de Google Cloud:

    Página Trabajos de AI Platform Training

  2. Haz clic en el botón Trabajo de entrenamiento nuevo. En las opciones que se muestran a continuación, haz clic en Entrenamiento de algoritmos integrados.

  3. En la página Crea un trabajo de entrenamiento nuevo, selecciona Clasificación de imágenes y, luego, haz clic en Siguiente.

Selecciona los datos de entrenamiento y validación

  1. En el cuadro desplegable debajo de Datos de entrenamiento, especifica si usas un solo archivo o varios:

    • Si usas un solo archivo, selecciona “Usar un solo archivo en un depósito de GCS”.
    • Si usas varios archivos, selecciona “Usar varios archivos almacenados en un directorio de Cloud Storage”.
  2. En Ruta del directorio, haz clic en Explorar. En el panel derecho, haz clic en el nombre del bucket en el que subiste los datos de entrenamiento y navega hasta tu archivo.

    Si seleccionas varios archivos, coloca los caracteres comodín en Nombre del comodín. La “Ruta de acceso completa de GCS” se muestra debajo para que puedas confirmar si es correcta.

  3. En el cuadro desplegable debajo de Datos de validación, especifica si usas un solo archivo o varios:

    • Si usas un solo archivo, selecciona “Usar un solo archivo en un depósito de GCS”.
    • Si usas varios archivos, selecciona “Usar varios archivos almacenados en un directorio de Cloud Storage”.
  4. En Ruta del directorio, haz clic en Explorar. En el panel derecho, haz clic en el nombre del bucket en el que subiste los datos de entrenamiento y navega hasta tu archivo.

    Si seleccionas varios archivos, coloca los caracteres comodín en Nombre del comodín. La “Ruta de acceso completa de GCS” se muestra debajo para que puedas confirmar si es correcta.

  5. En Directorio de resultados, ingresa la ruta de acceso al depósito de Cloud Storage en el que deseas que AI Platform Training almacene los resultados del trabajo de entrenamiento. Puedes completar la ruta de acceso al depósito de Cloud Storage directamente o hacer clic en el botón Explorar para seleccionarla.

    A fin de mantener el orden, crea un directorio nuevo dentro del bucket de Cloud Storage para este trabajo de entrenamiento. Puedes hacerlo desde el panel Explorar.

    Haz clic en Siguiente.

Configura los argumentos del algoritmo

Cada argumento específico del algoritmo muestra un valor predeterminado para los trabajos de entrenamiento sin ajuste de hiperparámetros. Si habilitas el ajuste de hiperparámetros en un argumento de algoritmo, debes especificar su valor mínimo y máximo.

Si deseas obtener más información sobre todos los argumentos de algoritmo, sigue los vínculos en la consola de Google Cloud y consulta la referencia del algoritmo integrado de clasificación de imágenes para conocer más detalles.

Envía el trabajo

En la pestaña Configuración del trabajo, haz lo siguiente:

  1. Ingresa un ID de trabajo único.
  2. Ingresa una región disponible (como “us-central1”).
  3. A fin de elegir los tipos de máquinas, selecciona “CUSTOM” para el nivel de escala. Aparecerá una sección para que proporciones la especificación personalizada del clúster.
    1. Selecciona un tipo de máquina disponible para el tipo principal.
    2. Si deseas usar TPU, configura el Tipo de trabajador como cloud_tpu. El recuento de trabajadores se establece de forma predeterminada en 1.

Haz clic en Listo para enviar el trabajo de entrenamiento.

gcloud

  1. Configura las variables de entorno para tu trabajo:

    PROJECT_ID="YOUR_PROJECT_ID"
    BUCKET_NAME="YOUR_BUCKET_NAME"
    
    # Specify the same region where your data is stored
    REGION="YOUR_REGION"
    
    gcloud config set project $PROJECT_ID
    gcloud config set compute/region $REGION
    
    # Set Cloud Storage paths to your training and validation data
    # Include a wildcard if you select multiple files.
    TRAINING_DATA_PATH="gs://${BUCKET_NAME}/YOUR_DATA_DIRECTORY/train-*.tfrecord"
    VALIDATION_DATA_PATH="gs://${BUCKET_NAME}/YOUR_DATA_DIRECTORY/eval-*.tfrecord"
    
    # Specify the Docker container for your built-in algorithm selection
    IMAGE_URI="gcr.io/cloud-ml-algos/image_classification:latest"
    
    # Variables for constructing descriptive names for JOB_ID and JOB_DIR
    DATASET_NAME="flowers"
    ALGORITHM="image_classification"
    MODEL_NAME="${DATASET_NAME}_${ALGORITHM}"
    DATE="$(date '+%Y%m%d_%H%M%S')"
    
    # Specify an ID for this job
    JOB_ID="${MODEL_NAME}_${DATE}"
    
    # Specify the directory where you want your training outputs to be stored
    JOB_DIR="gs://${BUCKET_NAME}/algorithm_training/${JOB_ID}"
    
  2. Envía el trabajo:

    gcloud ai-platform jobs submit training $JOB_ID \
      --region=$REGION \
      --config=config.yaml \
      --master-image-uri=$IMAGE_URI \
      -- \
      --training_data_path=$TRAINING_DATA_PATH \
      --validation_data_path=$VALIDATION_DATA_PATH \
      --job-dir=$JOB_DIR \
      --max_steps=30000 \
      --train_batch_size=128 \
      --num_classes=5 \
      --num_eval_images=100 \
      --initial_learning_rate=0.128 \
      --warmup_steps=1000 \
      --model_type='efficientnet-b4'
  3. Una vez que enviaste el trabajo de forma correcta, puedes ver los registros si ejecutas los siguientes comandos de gcloud:

    gcloud ai-platform jobs describe $JOB_ID
    gcloud ai-platform jobs stream-logs $JOB_ID
    

¿Qué sigue?