使用内置图片分类算法进行训练

使用 AI Platform Training 中的内置算法进行训练时,您无需编写任何训练代码即可提交数据集并训练模型。本页面介绍内置图片分类算法的工作原理以及使用方法。

概览

内置的图片分类算法使用训练和验证数据集连续训练模型,然后输出在训练作业过程中生成的最准确的 SavedModel。您还可以使用超参数调节来获得最佳模型准确度。导出的 SavedModel 可直接用于本地预测,也可部署到 AI Platform Prediction 以用于生产环境服务。

限制

图片内置算法支持使用单个 CPU、GPU 或 TPU 进行训练。生成的 SavedModel 适用于在 CPU 和 GPU 上应用。

使用内置图片分类算法进行训练时,不支持以下功能:

支持的机器类型

以下是系统支持的 AI Platform Training 容量层级和机器类型

  • BASIC 容量层级
  • BASIC_TPU 容量层级
  • CUSTOM 容量层级和 AI Platform Training 所支持的任何 Compute Engine 机器类型
  • CUSTOM 容量层级和以下任何旧版机器类型
    • 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 个核心)

授权 Cloud TPU 访问项目

设置输入数据的格式以用于训练

内置的图片分类算法要求输入数据的格式为 tf.Examples,并保存在 TFRecord 文件中。tf.Example 数据结构和 TFRecord 文件格式均旨在通过 TensorFlow 高效读取数据。

TFRecord 格式是一种用于存储一系列二进制记录的简单格式。 在本例中,所有记录都包含图片的二进制表示形式。每个图片及其类别标签都表示为 tf.Example。您可以将多个 tf.Example 保存到单个 TFRecord 文件中。您还可以将一个大型数据集分片到多个 TFRecord 文件中。

详细了解 TFRecord 和 tf.Example

将图片转换为 TFRecord 格式

TensorFlow 提供了脚本,可用于将图片从 JPEG 格式转换为 TFRecord 格式。

您可以在以下情况下使用脚本:

  • 您将图片存储在 Cloud Storage 中。
  • 您有 CSV 文件,其中包含 Cloud Storage 中图片的路径及其对应的标签。例如:

    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
    
  • 您将这些 CSV 文件存储在 Cloud Storage 中。

以下示例展示了如何运行该脚本:

  1. 下载脚本:

    curl https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/jpeg_to_tf_record.py > ./jpeg_to_tf_record.py
    
  2. 如果您尚未设置项目 ID 和存储分区名称的变量,请执行此操作:

    PROJECT_ID="YOUR_PROJECT_ID"
    BUCKET_NAME="YOUR_BUCKET_NAME"
    
  3. 在临时文件中为数据集创建所有可能的标签的列表:

    cat << EOF > /tmp/labels.txt
    daisy
    dandelion
    roses
    sunflowers
    tulips
    EOF
    
  4. 使用来自公开 cloud-ml-data 存储分区的花卉数据和您的标签列表来运行脚本:

    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
    

检查 Cloud Storage 存储分区权限

要存储数据,请使用用于运行 AI Platform Training 作业的同一 Google Cloud 项目中的 Cloud Storage 存储分区。否则,需要向 AI Platform Training 授予对存储数据的 Cloud Storage 存储分区的访问权限

要求的输入格式

如需使用内置的图片分类算法进行训练,您的图片数据的结构必须为 tf.Example,其中包含以下字段:

  • image/encoded 是原始图片字符串。

  • image/class/label 是相应图片的单个整数标签。不支持每个实例多个标签

    用于数据集的整数标签集必须是从 1 开始的连续序列。例如,如果您的数据集有五个类,则每个标签必须是区间 [1, 5] 中的一个整数。

例如:

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

获取最佳 SavedModel 作为输出

训练作业完成后,AI Platform Training 会将 TensorFlow SavedModel 写入您在提交作业时指定为 jobDir 的 Cloud Storage 存储分区。SavedModel 写入 jobDir/model。例如,如果您将作业提交到 gs://your-bucket-name/your-job-dir,则 AI Platform Training 会将 SavedModel 写入 gs://your-bucket-name/your-job-dir/model

如果您启用了超参数调节,AI Platform Training 会返回在训练过程中获得的具有最高准确度的 TensorFlow SavedModel。例如,如果您提交的训练作业包含 2500 个训练步骤,且准确度在 2000 个步骤时最高,您会获得从该特定点保存的 TensorFlow SavedModel。

每次 AI Platform Training 试验都会将具有最高准确度的 TensorFlow SavedModel 写入其在您的 Cloud Storage 存储分区内的专属目录中。例如 gs://your-bucket-name/your-job-dir/model/trial_{trial_id}

输出 SavedModel 签名是:

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

输入:

  • image_bytes:原始(未解码)图片字节。这与 tf.Example 中存储的 image/encoded 相同。
  • key:预测输入的字符串值标识符。此值会传递给输出 key。在批量预测中,这有助于将预测输出映射到输入。

输出:

  • classes:预测的类(整数)标签,即概率最高的标签。
  • key:输出键。
  • probabilities:每个 class(范围从 0 到 num_classes)的 probability(介于 0 和 1 之间)。

以下是预测输入和输出的示例:

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

配置示例

如果您使用 gcloud 提交作业,则需要针对机器类型和超参数调节规范创建 config.yaml 文件。如果您使用 Google Cloud 控制台,则无需创建此文件。了解如何提交训练作业

以下示例 config.yaml 文件展示了如何为训练作业分配 TPU 资源:

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

接下来,使用 config.yaml 文件来提交训练作业

超参数调节配置

如需使用超参数调节,请将超参数调节配置添加到与机器配置相同的 config.yaml 文件中。

您可以在 Google Cloud 控制台中查找每个超参数的简要说明,并在内置图片分类算法参考文档中查看更详细的说明。

以下示例 config.yaml 文件展示了如何为训练作业分配 TPU 资源,并包含超参数调节配置:

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

提交图片分类训练作业

本部分介绍如何使用内置的图片分类算法提交训练作业。

控制台

选择算法

  1. 转到 Google Cloud 控制台中的 AI Platform Training“作业”页面:

    AI Platform Training“作业”页面

  2. 点击新建训练作业按钮。从下方显示的选项中,点击内置算法训练

  3. 创建新训练作业页面上,选择图片分类,然后点击下一步

选择训练和验证数据

  1. 训练数据下的下拉框中,指定您要使用单个文件还是多个文件:

    • 对于单个文件,请选择“使用 GCS 存储分区中的单个文件”(Use single file in a GCS bucket" selected)。
    • 对于多个文件,请选择“使用存储在一个 Cloud Storage 目录中的多个文件”。
  2. 对于目录路径,请点击浏览。在右侧面板中,点击您将训练数据上传到的存储分区的名称,然后导航到您的文件。

    如果您要选择多个文件,请将通配符放入通配符名称。下面显示了“完整的 GCS 路径”,可帮助您确认路径是否正确。

  3. 验证数据下的下拉框中,指定您要使用单个文件还是多个文件:

    • 对于单个文件,请选择“使用 GCS 存储分区中的单个文件”(Use single file in a GCS bucket" selected)。
    • 对于多个文件,请选择“使用存储在一个 Cloud Storage 目录中的多个文件”。
  4. 对于目录路径,请点击浏览。在右侧面板中,点击您将训练数据上传到的存储分区的名称,然后导航到您的文件。

    如果您要选择多个文件,请将通配符放入通配符名称。下面显示了“完整的 GCS 路径”,可帮助您确认路径是否正确。

  5. 输出目录中,输入您希望 AI Platform Training 用于存储训练作业输出的 Cloud Storage 存储分区的路径。您可以直接填写 Cloud Storage 存储分区路径,或点击浏览按钮来选择。

    为了便于管理,请在 Cloud Storage 存储分区中为此训练作业创建一个新目录。您可以在浏览窗格中执行此操作。

    点击下一步

设置算法参数

在未进行超参数调节的情况下,每个算法特定的参数都会显示训练作业的默认值。如果您对某个算法参数启用了超参数调节,则必须指定其最小值和最大值。

如需详细了解所有算法参数,请点击 Google Cloud 控制台中的链接,并参阅内置图片分类参考文档,以了解详情。

提交作业

作业设置标签页上,执行以下操作:

  1. 输入唯一作业 ID
  2. 输入可用区域(例如“us-central1”)。
  3. 如需选择机器类型,请在容量层级部分选择“CUSTOM”。 此时,系统会显示一个提供自定义集群规范的部分。
    1. 对于主机器类型,请选择可用的机器类型。
    2. 如果希望使用 TPU,请将工作器类型设置为 cloud_tpu“工作器计数”默认为 1。

点击完成,提交训练作业。

gcloud

  1. 为作业设置环境变量:

    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. 提交作业:

    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. 成功提交作业后,您可以使用以下 gcloud 命令查看日志:

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

后续步骤