继机器学习与结构化数据系列第一篇介绍了如何准备数据及分析之后,此篇文章将接续上一篇,介绍如何训练模型。
您必须为 Estimator API 定义 serving_input_fn 函数。此方法定义列以用作预测服务的 API 请求的输入。输入列通常与 CSV 文件中的输入列相同,但在某些情况下,您希望接受与您在模型训练过程中使用的格式不同的输入数据。
通过使用此方法,您可以将输入数据转换为与训练期间使用的表单相同的表单。预测的预处理步骤必须与您在训练中使用的预处理步骤相同,否则您的模型将无法做出准确的预测。
创建和训练模型
下一步是创建一个模型并使用数据集对其进行训练。
定义模型
使用 Estimator API 定义模型是一个简单的过程。以下单行代码分别使用 wide 和 deep 的输入来构建广且深模型。它返回一个包含已定义模型的 Estimator 物件。
estimator = tf.estimator.DNNLinearCombinedRegressor( model_dir=output_dir, linear_feature_columns=wide, dnn_feature_columns=deep, dnn_hidden_units=[64, 32])
您可以使用 model_dir 选项指定各种训练输出的存储位置。 dnn_hidden_units 选项定义了模型深部的前馈神经网络结构。在这种情况下,使用两个隐藏层,由 64 和 32 个节点组成。
每层中的层数和节点数是可调参数,为了将模型复杂度调整到数据复杂度,需要进行一些实验。如果模型太复杂,通常会出现过度拟合,即模型学习了特定于训练集的特征,但未能对新数据做出好的预测。对于少量的输入特征(在这种情况下为 3),具有 64 和 32 个节点的两层是一个很好的经验起点。
在 Cloud Datalab 上运行训练作业
您通过调用 tf.estimator.train_and_evaluate 函数并指定 Estimator 物件来执行训练作业。如果此作业在分布式训练环境(例如Cloud ML Engine)上运行,则此特征会将训练任务分配给多个工作节点,并定期将检查点保存在 Estimator 物件的 model_diroption 指定的存储位置。该函数还会按照定义的时间间隔调用评估循环来计算度量以评估模型的性能。最后, tf.estimator.train_and_evaluate 函数以 SavedModel 格式导出训练过的模型。
tf.estimator.train_and_evaluate 函数可以从最新的检查点恢复训练。例如,如果您执行指定 train_steps=10000 的训练,则在使用 10,000 批次训练后,模型的参数值将存储在检查点文件中。当您再次使用 train_steps=20000 执行训练时,它会从检查点恢复模型并从步数 10,001 开始训练。
如果您想从头开始重新开始训练,则必须在开始训练之前移除检查点文件。在笔记本中,这是通过提前删除 babyweight_trained 目录来完成的。
因为在笔记本的这部分中,训练是在托管 Cloud Datalab 的虚拟机实例上执行的,而不是在分布式训练环境中执行,所以应该使用少量数据。笔记本通过将文件模式指定为 pattern = “00001-of-“并将 train_steps 值设置为 1,000 来使用单个 CSV 文件进行训练和评估。
利用 Cloud ML Engine 进行训练
如果您确信自己的模型没有任何明显问题,并且已经准备好接受完整数据集的训练,则可以制作一个 Python包,其中包含您在笔记本上开发的代码并在 Cloud ML Engine 上执行它。
您使用从 GitHub clone 的预包装代码并将其传输到您的 Cloud Datalab 环境中以实现此目的。您可以浏览 GitHub 上的目录结构。
本地运行
在向 Cloud ML Engine 提交训练作业之前,在您的 Cloud Datalab 实例上本地测试程式码是一种很好的做法。您可以使用笔记本上 Cloud on ML 训练教程部分的第二个单元来完成此操作。由于预包装代码是一个 Python 包,因此您可以像运行笔记本时使用标准 Python代码一样运行它。但是,必须通过指定选项 –pattern=”00001-of-“and –train_steps=1000. 来限制用于训练的数据量。
在 Cloud ML Engine 上运行
要使用 Cloud ML Engine 训练模型,您必须使用 gcloud 工具提交训练作业。
检查点文件和导出的模型存储在由 –output_diroption 指定的云存储存储区中。如果要从头开始重新开始训练,则必须删除旧的检查点文件。为此,请取消单元格中的 “#gsutil -m rm -rf $OUTDIR” 行的注释。
在您提交训练作业 Cloud ML Engine 后,打开 Google Cloud Platform 控制台中的 ML 引擎页面以查找正在运行的作业。
在这里,您可以从训练工作中找到日志。要查看各种指标的图形,可以通过在笔记本中同一部分的第四个单元格中执行命令来启动 TensorBoard。下图显示了与训练期间评估集合生成的 RMSE 值相对应的 average_loss 值。您可以在 TensorBoard 上将滑动条设置为平滑,以查看实际更改。
如果模型训练成功,则 RMSE 值通常会呈指数衰减。衰减反映了这样一个事实,即模型的准确性在初始迭代中提高得非常快,但需要更多迭代才能实现最佳模型性能。
注意:图中没有显示平滑的指数曲线,因为在这个例子中训练非常短暂,所以RMSE值只在两点进行评估。
当您完成使用 TensorBoard 时,请按照笔记本中的说明停止它。
部署训练好的模型
训练作业成功完成后,将训练的模型导出到云存储存储桶。
包含模型输出的目录路径看起来像 $OUTDIR/export/exporter/1492051542987/,其中 $OUTDIR 是上一步中由 –output_dir 选项指定的存储路径。最后一部分是时间戳,每个作业都不相同。您可以从位于工作结束附近的训练日志中找到实际路径,如下例所示:
SavedModel written to: gs://cloud-training-demos-ml/babyweight/trained_model/export/exporter/1492051542987/saved_model.pb
或者,您可以使用 gsutil 命令在笔记本中检查 $OUTDIR 下的目录内容。通过将此目录路径指定为 gcloud 命令的选项,您可以在 Cloud ML Engine 上部署该模型以提供预测 API 服务。
按照笔记本中的说明,您可以为预测服务定义广且深的模型,并部署与模型版本关联的模型。版本名称是任意的,您可以同时部署多个版本。您可以在 API 请求中指定版本进行预测,您将在下一节中进行这些预测。您也可以定义在请求中未指定版本时要使用的默认版本。
将模型部署到预测服务后,可以使用 GCP 控制台中的 ML 引擎页面来查看已定义模型和关联版本的列表:
使用模型生成预测
在笔记本中,您可以使用适用于 Google API Client Libraries for Python 将请求发送到您在前一部分中部署的预测 API 服务。
该请求包含与由训练码中的 serving_input_fn 函数定义的字典元素对应的 JSON 数据。如果 JSON 数据包含多个记录,则 API 服务将返回每个记录的预测。您可以按照笔记本中的示例了解有关如何使用客户端库的更多信息。
在项目之外使用客户端函式库时(例如在外部 Web 服务器上),必须使用 API 密钥或 OAuth 2.0 进行身份验证。
收尾
如果您打算继续本系列的第 3 部分,请保留您在此步骤中创建的资源。否则,为避免继续收费,请转到 Google Developers Console Project List,选择您为本教程创建的项目并删除它。
下一步
继续第三部分,部署 Web 应用程序以部署在 App Engine 上运行的 Web 应用程序以进行在线预测。
延伸阅读
机器学习与结构化数据(1):数据分析和准备
机器学习与结构化数据 (2-1):训练模型
(原文翻译自 Google Cloud。)
