Como treinar usando o algoritmo de classificação de imagens integrado

O treinamento com algoritmos integrados no AI Platform Training permite enviar o conjunto de dados e treinar um modelo, sem a necessidade de escrever qualquer código de treinamento. Nesta página, você verá como funciona o algoritmo de classificação de imagens integrado e como usá-lo.

Informações gerais

O algoritmo de classificação de imagens integrado usa os conjuntos de dados de treinamento e validação para treinar modelos continuamente e tem como resultado o SavedModel mais preciso gerado durante o curso do job de treinamento. Também é possível usar o ajuste de hiperparâmetros para atingir a melhor acurácia do modelo. É possível usar o SavedModel exportado diretamente para previsão, seja localmente ou implantado no AI Platform Prediction para serviço de produção.

Limitações

Os algoritmos integrados de imagem permitem treinamento com CPUs, GPUs ou TPUs únicas. O SavedModel resultante é compatível com exibição em CPUs e GPUs.

Os seguintes recursos não são compatíveis com o treinamento usando o algoritmo de classificação de imagens integrado:

Tipos de máquina compatíveis

Os níveis de escalonamento e tipos de máquina do AI Platform Training a seguir são compatíveis:

  • Nível de escalonamento BASIC
  • Nível de escalonamento BASIC_TPU
  • CUSTOMNível de escalonamento PERSONALIZADO com qualquer um dos tipos de máquina do Compute Engine compatíveis com o AI Platform Training.
  • Nível de escalonamento CUSTOM com qualquer um destes tipos de máquina legados:
    • standard
    • large_model
    • complex_model_s
    • complex_model_m
    • complex_model_l
    • standard_gpu
    • standard_p100
    • standard_v100
    • large_model_v100
    • complex_model_m_gpu
    • complex_model_l_gpu
    • complex_model_m_p100
    • complex_model_m_v100
    • complex_model_l_v100
    • TPU_V2 (8 núcleos)

Autorize o acesso da Cloud TPU ao projeto

Formatar dados de entrada para treinamento

O algoritmo de classificação de imagens integrado exige que os dados de entrada sejam formatados como tf.Examples e salvos em arquivo(s) TFRecord. A estrutura de dados de tf.Example e o formato de arquivo TFRecord foram projetados para uma leitura de dados eficiente com o TensorFlow.

O TFRecord é um formato simples para armazenar uma sequência de registros binários. Neste caso, todos os registros contêm representações binárias de imagens. Cada imagem, com os respectivos rótulos de classe, é representada como tf.Example. É possível salvar muitos tf.Examples em um único arquivo TFRecord. É possível também fragmentar um conjunto de dados grande em vários arquivos TFRecord.

Saiba mais sobre TFRecord e tf.Example (em inglês).

Converter as imagens em TFRecords

O TensorFlow inclui um script (em inglês) que você usa para converter as imagens JPEG no formato TFRecord.

Use o script se:

  • você armazena as imagens no Cloud Storage;
  • você tem arquivos CSV com os caminhos para as imagens no Cloud Storage, e os rótulos correspondentes. Exemplo:

    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
    
  • você armazena esses arquivos CSV no Cloud Storage.

No exemplo a seguir, mostramos como executar o script:

  1. Faça o download do script:

    curl https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/jpeg_to_tf_record.py > ./jpeg_to_tf_record.py
    
  2. Defina as variáveis do ID do projeto e o nome do intervalo, caso ainda não tenha feito isso:

    PROJECT_ID="YOUR_PROJECT_ID"
    BUCKET_NAME="YOUR_BUCKET_NAME"
    
  3. Crie uma lista de todos os rótulos possíveis para o conjunto de dados em um arquivo temporário:

    cat << EOF > /tmp/labels.txt
    daisy
    dandelion
    roses
    sunflowers
    tulips
    EOF
    
  4. Execute o script usando os dados de flores do intervalo cloud-ml-data público e sua lista de rótulos:

    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
    

Verificar as permissões do bucket do Cloud Storage

Para armazenar seus dados, use um bucket do Cloud Storage no mesmo projeto do Google Cloud usado para executar jobs do AI Platform Training. Caso contrário, conceda acesso de treinamento do AI Platform ao intervalo do Cloud Storage onde os dados estão armazenados.

Formato de entrada obrigatório

Para treinar com o algoritmo de classificação de imagens integrado, é necessário que os dados de imagem sejam estruturados como tf.Examples, com os seguintes campos:

  • image/encoded: a string de imagem bruta;

  • image/class/label é um rótulo inteiro único para a imagem correspondente. Vários rótulos por instância não são compatíveis.

    O grupo de rótulos inteiros usados para o conjunto de dados precisa ser uma sequência a partir de 1. Por exemplo, se o conjunto de dados tiver cinco classes, cada rótulo precisará ser um número inteiro no intervalo [1, 5].

Exemplo:

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

Como obter o melhor SavedModel como saída

Quando o job de treinamento for concluído, o AI Platform Training gravará um SavedModel do TensorFlow no intervalo do Cloud Storage que você especificou como jobDir quando enviou o job. O SavedModel é gravado em jobDir/model. Por exemplo, se você enviar o job para gs://your-bucket-name/your-job-dir, o AI Platform Training gravará o SavedModel em gs://your-bucket-name/your-job-dir/model.

Se você ativou o ajuste de hiperparâmetros, o AI Platform Training retorna o SavedModel do TensorFlow com a maior precisão alcançada durante o processo de treinamento. Por exemplo, se você enviou um job de treinamento com 2.500 etapas de treinamento, e a precisão foi maior em 2.000 etapas, você consegue um SavedModel do TensorFlow salvo a partir desse ponto específico.

Cada avaliação do AI Platform Training grava o SavedModel do TensorFlow com a precisão mais alta no próprio diretório dele no seu intervalo do Cloud Storage. Por exemplo, gs://your-bucket-name/your-job-dir/model/trial_{trial_id}.

A assinatura do SavedModel de saída será esta:

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

Entradas:

  • image_bytes: os bytes da imagem bruta (não decodificada). É o mesmo image/encoded armazenado em tf.Example.
  • key: o identificador do valor da string da entrada de previsão. Esse valor é transmitido para key de saída. Na previsão em lote, ele ajuda a mapear a saída da previsão para a entrada.

Saídas:

  • classes: o rótulo de classe previsto (inteiro), que é aquele com a probabilidade mais alta.
  • key: a chave de saída.
  • probabilities: a probability (entre 0 e 1) de cada class (variando de 0 a num_classes).

A seguir, há um exemplo de entradas e saídas de previsão:

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'],
}

Exemplos de configurações

Se você enviar um job usando gcloud, precisará criar um arquivo config.yaml para suas especificações de ajuste de hiperparâmetros e tipo de máquina. Se você usa o console do Google Cloud, não precisa criar esse arquivo. Saiba como enviar um job de treinamento.

No seguinte exemplo de arquivo config.yaml, mostramos como alocar recursos de TPU para seu job de treinamento:

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

Em seguida, use o arquivo config.yaml para enviar um job de treinamento.

Configuração de ajuste de hiperparâmetros

Para usar o ajuste de hiperparâmetros, inclua a respectiva configuração no mesmo arquivo config.yaml da configuração da máquina.

Você encontra explicações breves de cada hiperparâmetro no Console do Google Cloud e uma explicação mais abrangente na referência do algoritmo de classificação de imagens integrado.

No seguinte exemplo de arquivo config.yaml, você verá como alocar recursos de TPU para o job de treinamento, bem como a configuração de 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

Enviar um job de treinamento de classificação de imagens

Nesta seção, você verá como enviar um job de treinamento usando o algoritmo integrado de classificação de imagens.

Console

Selecionar o algoritmo

  1. Acesse a página "Jobs" do AI Platform Training no console do Google Cloud:

    Página "Jobs" do AI Platform Training

  2. Clique no botão Novo job de treinamento. Nas opções exibidas abaixo, clique em Treinamento de algoritmo integrado.

  3. Na página Criar um novo job de treinamento, selecione Classificação de imagens e clique em Avançar.

Selecionar os dados de treinamento e validação

  1. No menu suspenso abaixo de Dados de treinamento, especifique se você usa um ou vários arquivos:

    • No caso de um único arquivo, mantenha selecionada a opção "Usar arquivo único em um intervalo do GCS".
    • No caso de vários arquivos, selecione "Usar vários arquivos armazenados em um diretório do Cloud Storage".
  2. Em Caminho do diretório, clique em Procurar. No painel à direita, clique no nome do intervalo em que você fez upload dos dados de treinamento e navegue até o arquivo.

    Se você selecionar vários arquivos, insira os caracteres curinga em Nome do caractere curinga. O "Caminho completo do GCS" é exibido abaixo para ajudar você a confirmar que o caminho está correto.

  3. No menu suspenso abaixo de Dados de validação, especifique se você usa um ou vários arquivos:

    • No caso de um único arquivo, mantenha selecionada a opção "Usar arquivo único em um intervalo do GCS".
    • No caso de vários arquivos, selecione "Usar vários arquivos armazenados em um diretório do Cloud Storage".
  4. Em Caminho do diretório, clique em Procurar. No painel à direita, clique no nome do intervalo em que você fez upload dos dados de treinamento e navegue até o arquivo.

    Se você selecionar vários arquivos, insira os caracteres curinga em Nome do caractere curinga. O "Caminho completo do GCS" é exibido abaixo para ajudar você a confirmar que o caminho está correto.

  5. Em Diretório de saída, insira o caminho para o intervalo do Cloud Storage em que o AI Platform Training armazenará as saídas do seu job de treinamento. Preencha o caminho do intervalo do Cloud Storage diretamente ou clique no botão Procurar para selecioná-lo.

    Para manter a organização, crie um novo diretório no intervalo do Cloud Storage para esse job de treinamento. Faça isso no painel Procurar.

    Clique em Próxima.

Definir os argumentos do algoritmo

Cada argumento específico de algoritmo exibe um valor padrão de jobs de treinamento sem ajuste de hiperparâmetros. Se você ativar o ajuste de hiperparâmetros em um argumento de algoritmo, precisará especificar os valores mínimo e máximo dele.

Para saber mais sobre todos os argumentos de algoritmo, siga os links no Console do Google Cloud e consulte a referência do algoritmo de classificação de imagens integrado para mais detalhes.

Enviar o job

Na guia Configurações do job, faça o seguinte:

  1. Insira um ID do job exclusivo.
  2. Insira uma região disponível, como "us-central1".
  3. Para escolher tipos de máquina, selecione "CUSTOM" em nível de escalonamento. Será exibida uma seção para que você forneça sua Especificação de cluster personalizada.
    1. Selecione um tipo de máquina disponível em Tipo mestre.
    2. Se você quiser usar TPUs, defina o Tipo de worker como cloud_tpu. A contagem de workers é padronizada como 1.

Clique em Concluído para enviar o job de treinamento.

gcloud

  1. Defina as variáveis de ambiente do seu job:

    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. Envie o job:

    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. Depois que o job for enviado com êxito, será possível visualizar os registros usando os comandos gcloud a seguir:

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

A seguir