关于此 Codelab
2. 创建 AI Platform Notebooks 实例
您需要一个启用了结算功能的 Google Cloud Platform 项目才能运行此 Codelab。如需创建项目,请按照此处的说明操作。
第 2 步:启用 Compute Engine API
前往 Compute Engine,然后选择启用(如果尚未启用)。您需要用它来创建笔记本实例。
第 3 步:创建笔记本实例
前往 Cloud 控制台的 AI Platform Notebooks 部分,然后点击新建实例。然后选择不带 GPU 的最新 TensorFlow 2 企业版实例类型:
为实例命名或使用默认名称。然后,我们将探索自定义选项。点击自定义按钮:
AI Platform Notebooks 提供许多不同的自定义选项,包括:部署实例的区域、映像类型、机器大小、GPU 数量等。我们将使用区域和环境的默认值。对于机器配置,我们将使用 n1-standard-8 机器:
我们将不添加任何 GPU,将使用默认的启动磁盘、网络和权限。选择创建以创建实例。这需要几分钟才能完成。
创建实例后,您会在 Notebooks 界面中看到该实例旁边有一个绿色对勾标记。选择打开 JupyterLab 以打开您的实例并开始原型设计:
打开该实例时,创建一个名为 Codelab 的新目录。在本实验中,我们将使用以下目录:
双击新创建的 codelab 目录,然后点击该目录,然后从启动器中选择 Python 3 笔记本:
将笔记本重命名为 demo.ipynb
,或您想为其指定的任何名称。
第 4 步:导入 Python 软件包
在笔记本中创建一个新单元,并导入我们将在此 Codelab 中使用的库:
import pandas as pd
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
import numpy as np
import json
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from google.cloud import bigquery
from witwidget.notebook.visualization import WitWidget, WitConfigBuilder
3. 将 BigQuery 数据连接到您的笔记本
BigQuery 是 Google Cloud 的大数据仓库,公开提供了许多数据集供您探索。AI Platform Notebooks 支持直接与 BigQuery 集成,无需进行身份验证。
在本实验中,我们将使用出生率数据集。其中包含美国 40 年来几乎所有的出生数据,包括婴儿的出生体重和有关婴儿父母的人口统计信息。我们将使用一部分特征来预测婴儿的出生体重。
第 1 步:将 BigQuery 数据下载到我们的笔记本
我们将使用适用于 BigQuery 的 Python 客户端库将数据下载到 Pandas DataFrame 中。原始数据集为 21 GB,包含 1.23 亿行。为简单起见,我们仅使用数据集中的 10,000 行。
使用以下代码构建查询并预览生成的 DataFrame。在这里,我们从原始数据集中获得 4 个特征,以及婴儿体重(模型将预测的内容)。数据集可以追溯到很多年,但对于此模型,我们仅使用 2000 年之后的数据:
query="""
SELECT
weight_pounds,
is_male,
mother_age,
plurality,
gestation_weeks
FROM
publicdata.samples.natality
WHERE year > 2000
LIMIT 10000
"""
df = bigquery.Client().query(query).to_dataframe()
df.head()
如需获取数据集中数字特征的摘要,请运行以下命令:
df.describe()
其中显示了数字列的平均、标准差、最小值及其他指标。最后,让我们在指示婴儿性别的布尔值列中获取一些数据。我们可以使用 Pandas value_counts
方法来实现此目的:
df['is_male'].value_counts()
该数据集似乎在性别方面几乎达到了 50/50 的平衡。
第 2 步:准备用于训练的数据集
现在,我们已将数据集作为 Pandas DataFrame 下载到笔记本中,我们可以进行一些预处理,并将其拆分为训练集和测试集。
首先,我们从数据集中丢弃具有 null 值的行,并重排数据:
df = df.dropna()
df = shuffle(df, random_state=2)
接下来,将标签列提取到单独的变量中,并创建一个仅包含特征的 DataFrame。由于 is_male
是布尔值,因此我们会将其转换为整数,以使模型的所有输入都是数字:
labels = df['weight_pounds']
data = df.drop(columns=['weight_pounds'])
data['is_male'] = data['is_male'].astype(int)
现在,如果通过运行 data.head()
预览数据集,您应该会看到我们将用于训练的四个特征。
4. 初始化 git
AI Platform Notebooks 直接集成了 Git,因此您可以直接在笔记本环境中进行版本控制。这支持直接在笔记本界面中或通过 JupyterLab 中的终端提交代码。在本部分,我们将在笔记本中初始化一个 git 代码库,并通过界面进行第一次提交。
第 1 步:初始化 Git 代码库
在 Codelab 目录中,选择 Git,然后从 JupyterLab 的顶部菜单栏中选择 Init:
当系统询问您是否要将此目录设为 Git 代码库时,请选择 Yes。然后,选择左侧边栏中的 Git 图标,查看您的文件和提交的状态:
第 2 步:进行首次提交
在此界面中,您可以向提交中添加文件、查看文件差异(稍后会介绍)以及提交更改。首先提交刚刚添加的笔记本文件。
选中 demo.ipynb
笔记本文件旁边的复选框,以暂存该文件以进行提交(您可以忽略 .ipynb_checkpoints/
目录)。在文本框中输入一条提交消息,然后点击复选标记以提交您的更改:
出现提示时,输入您的名称和电子邮件地址。然后,返回历史记录标签页,查看您的第一项提交:
请注意,由于此实验发布之后进行了更新,因此屏幕截图可能与您的界面不完全一致。
5. 构建和训练 TensorFlow 模型
我们将使用已下载到笔记本的 BigQuery 出生率数据集来构建预测婴儿体重的模型。在本实验中,我们将关注笔记本工具,而不是模型本身的准确率。
第 1 步:将数据拆分为训练集和测试集
构建模型之前,我们将使用 Scikit Learn train_test_split
实用程序拆分数据:
x,y = data,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)
现在,我们可以构建 TensorFlow 模型了!
第 2 步:构建和训练 TensorFlow 模型
我们将使用 tf.keras Sequential
模型 API 构建此模型,该 API 让我们可以将模型定义为层的堆栈。构建模型所需的所有代码都位于此处:
model = Sequential([
Dense(64, activation='relu', input_shape=(len(x_train.iloc[0]),)),
Dense(32, activation='relu'),
Dense(1)]
)
然后,我们将编译模型以便训练模型。在这里,我们将选择模型的优化器、损失函数,以及我们希望模型在训练期间记录的指标。由于这是一个回归模型(预测数值),因此我们使用均方误差而不是准确率作为指标:
model.compile(optimizer=tf.keras.optimizers.RMSprop(),
loss=tf.keras.losses.MeanSquaredError(),
metrics=['mae', 'mse'])
您可以使用 Keras 便捷的 model.summary()
函数来查看每一层模型的可训练参数的形状和数量。
现在,我们可以开始训练模型了。我们只需调用 fit()
方法,并向其传递训练数据和标签。在这里,我们将使用可选的 verification_split 参数,该参数将保存一部分训练数据,以在每个步骤验证模型。理想情况下,您希望看到训练损失和验证损失同时下降。但请注意,在此示例中,我们更关注模型和笔记本工具,而不是模型质量:
model.fit(x_train, y_train, epochs=10, validation_split=0.1)
第 3 步:根据测试样本生成预测
为了了解模型的性能,让我们对测试数据集中的前 10 个样本生成一些测试预测。
num_examples = 10
predictions = model.predict(x_test[:num_examples])
然后,我们将对模型的预测结果进行迭代,将其与实际值进行比较:
for i in range(num_examples):
print('Predicted val: ', predictions[i][0])
print('Actual val: ',y_test.iloc[i])
print()
第 4 步:使用 git diff 并提交更改
现在,您已对笔记本进行了一些更改,接下来可以试用 Notebooks git 界面中提供的 git diff 功能。demo.ipynb
笔记本现在应位于“已更改”下部分。将鼠标悬停在文件名上,然后点击差异图标:
这样,您应该就可以看到更改的差异,如下所示:
这次我们将使用终端通过命令行提交更改。从 JupyterLab 顶部菜单栏中的 Git 菜单中,选择终端中的 Git 命令。如果在运行以下命令时,左侧边栏的 Git 标签页处于打开状态,您将能够看到所做的更改反映在 Git 界面中。
在新的终端实例中,运行以下命令以暂存笔记本文件以进行提交:
git add demo.ipynb
然后运行以下命令以提交您的更改(您可以使用所需的任何提交消息):
git commit -m "Build and train TF model"
然后,您应该会在历史记录中看到您最近的提交:
6. 直接在笔记本中使用 What-If 工具
What-If 工具是一个交互式可视化界面,旨在帮助您直观呈现数据集,并更好地了解机器学习模型的输出。它是 Google PAIR 团队打造的开源工具。虽然它可与任何类型的模型搭配使用,但具有专为 Cloud AI Platform 构建的一些特性。
What-If 工具已预安装在 TensorFlow 的 Cloud AI Platform Notebooks 实例中。在这里,我们将使用它来查看模型的整体表现,并检查模型在测试集中数据点上的行为。
第 1 步:为 What-If 工具准备数据
为了充分利用 What-If 工具,我们将发送测试集中的样本以及这些样本的标准答案标签 (y_test
)。这样,我们就可以将模型预测的内容与标准答案进行比较。运行以下代码行,使用我们的测试示例及其标签创建一个新的 DataFrame:
wit_data = pd.concat([x_test, y_test], axis=1)
在本实验中,我们将把 What-If 工具连接到我们刚刚在笔记本中训练的模型。为此,我们需要编写一个函数,供该工具将这些测试数据点运行到模型中:
def custom_predict(examples_to_infer):
preds = model.predict(examples_to_infer)
return preds
第 2 步:实例化 What-If 工具
我们将通过从串联的测试数据集和我们刚刚创建的标准答案标签中提取 500 个示例来对 What-If 工具进行实例化。我们创建一个 WitConfigBuilder
实例来设置该工具,向其传递数据、我们在上面定义的自定义预测函数,以及目标(我们要预测的内容)和模型类型:
config_builder = (WitConfigBuilder(wit_data[:500].values.tolist(), data.columns.tolist() + ['weight_pounds'])
.set_custom_predict_fn(custom_predict)
.set_target_feature('weight_pounds')
.set_model_type('regression'))
WitWidget(config_builder, height=800)
What-If 工具加载时,您应该会看到如下内容:
在 x 轴上,您可以看到测试数据点按照模型的预测权重值 (weight_pounds
) 展开。
第 3 步:使用 What-If 工具探索模型行为
What-If 工具具有许多很酷的功能。在这里,我们将仅介绍其中的几个。首先,我们来看看数据点编辑器。您可以选择任意数据点以查看其特征并更改特征值。首先点击任意数据点:
左侧显示的是所选数据点的特征值。您也可以将该数据点的标准答案标签与模型预测的值进行比较。在左侧边栏中,您还可以更改特征值并重新运行模型预测,以查看此更改对模型的影响。例如,我们可以通过双击重新运行预测来将此数据点的 gestation_weeks 更改为 30:
使用 What-If 工具绘制部分的下拉菜单,你可以创建各种自定义可视化图表。例如,这是一个包含模型的x 轴上的预测体重、y 轴上的母亲年龄以及由推理误差标上颜色的各个点(颜色越深表示预测体重与实际体重之间的差异越大)。在此示例中,随着权重减少,模型的误差略有增加:
接下来,选中左侧的部分依赖图按钮。这展示了每个特征如何影响模型的预测结果。例如,随着妊娠时间的增加,我们模型预测的婴儿体重也会增加:
如需关于 What-If 工具的更多探索提示,请点击本部分开头的链接。
7. 可选:将本地 Git 代码库连接到 GitHub
最后,我们将学习如何将笔记本实例中的 Git 代码库连接到 GitHub 账号中的代码库。如果您想执行此步骤,则需要一个 GitHub 账号。
第 1 步:在 GitHub 上创建新的代码库
在您的 GitHub 账号中,创建一个新的代码库。为其命名并添加说明,决定是否将其公开,然后选择 Create repository(无需使用 README 进行初始化)。在下一页中,您将按照从命令行推送现有代码库的说明进行操作。
打开终端窗口,然后将新代码库添加为远程代码库。将以下代码库网址中的 username
替换为您的 GitHub 用户名,并将 your-repo
替换为您刚刚创建的名称:
git remote add origin git@github.com:username/your-repo.git
第 2 步:在笔记本实例中向 GitHub 进行身份验证
接下来,您需要在笔记本实例中向 GitHub 进行身份验证。此过程取决于您是否在 GitHub 上启用了双重身份验证。
如果您不确定从何处开始,请按照 GitHub 文档中的步骤创建 SSH 密钥,然后将新密钥添加到 GitHub。
第 3 步:确保您已正确关联 GitHub 代码库
为确保您的设置正确无误,请在终端中运行 git remote -v
。您应该会看到新代码库列为远程代码库。看到 GitHub 代码库的网址并已通过笔记本向 GitHub 进行身份验证后,您就可以从笔记本实例直接推送到 GitHub。
如需将本地笔记本 git 代码库与新创建的 GitHub 代码库同步,请点击 Git 边栏顶部的云端上传按钮:
刷新 GitHub 代码库,您应该会看到包含之前提交的笔记本代码!如果其他人可以访问您的 GitHub 代码库,并且您想要将最新更改下拉到笔记本中,请点击云端下载图标以同步这些更改。
在 Notebooks git 界面的“历史记录”标签页中,您可以查看本地提交是否与 GitHub 同步。在此示例中,origin/master
与我们在 GitHub 上的代码库相对应:
每次提交新内容时,只需再次点击云端上传按钮,即可将相应更改推送到您的 GitHub 代码库。
8. 恭喜!
您在此实验室中已经完成很多 👏?👏?
回顾一下,您已经学习了如何:
- 创建自定义 AI Platform Notebook 实例
- 在该实例中初始化本地 Git 代码库,通过 Git 界面或命令行添加提交内容,在笔记本 Git 界面中查看 git diff
- 构建和训练简单的 TensorFlow 2 模型
- 在笔记本实例中使用 What-If 工具
- 将您的笔记本 git 代码库关联到 GitHub 上的外部代码库
9. 清理
如果您想继续使用该笔记本,建议您在不使用时将其关闭。在 Cloud 控制台的 Notebooks 界面中,选择相应笔记本,然后选择停止:
如果您想删除在本实验中创建的所有资源,只需删除该笔记本实例,而无需停止该实例。
使用 Cloud 控制台中的导航菜单,浏览到“存储空间”,然后删除您为存储模型资产而创建的两个存储分区。