auto-ml-autokeras-merge-1

48 阅读22分钟

AutoKeras 自动机器学习(二)

原文:annas-archive.org/md5/4b95d582294fbab3113a489dde33e6e5

译者:飞龙

协议:CC BY-NC-SA 4.0

第七章:第七章:使用 AutoKeras 进行情感分析

让我们先定义标题中的不寻常术语。情感分析是文本分类中广泛使用的术语,基本上是通过使用自然语言处理NLP)结合机器学习ML)来解读和分类文本中的情感。

为了理解这个概念,让我们假设任务是判断一篇电影评论是正面还是负面。您自己看完评论就能做出判断,对吧?然而,如果我们的老板发给我们 1000 条电影评论让我们明天完成,那事情就复杂了。这就是情感分析变得有趣的地方。

本章将使用文本分类器从文本数据中提取情感。文本分类的大部分概念已经在第四章使用 AutoKeras 进行图像分类和回归中解释过了,所以在本章中,我们将通过实现情感预测器以一种实际的方式来应用它们。然而,在我们开始之前,我们将首先了解开始工作所需的技术要求。

本章将具体涵盖以下主题:

  • 创建情感分析器

  • 创建分类器

  • 评估模型

  • 可视化模型

  • 分析特定句子中的情感

技术要求

本书中的所有代码示例都可以作为 Jupyter notebooks 下载,您可以从github.com/PacktPublishing/Automated-Machine-Learning-with-AutoKeras获取。

由于代码单元可以执行,因此每个 notebook 都可以自我安装;您只需要添加需要的依赖代码片段。因此,在每个 notebook 的开头都有一个用于环境设置的代码单元,它会安装 AutoKeras 及其依赖项。

所以,要运行本章的代码示例,您只需要一台操作系统为 Ubuntu Linux 的计算机,并用以下代码安装 Jupyter Notebook:

$ apt-get install python3-pip jupyter-notebook

或者,您也可以使用 Google Colaboratory 运行这些 notebooks,这种情况下您只需要一个网页浏览器。更多细节请参见第二章使用 Google Colaboratory 进行 AutoKeras部分。此外,在该章的安装 AutoKeras部分,您还可以找到其他安装选项。

现在,让我们通过一些实际示例来实践我们所学的内容。

创建情感分析器

我们要创建的模型将是一个用于情感的二分类器(1=正面/0=负面),数据集来自 IMDb 情感数据集。该数据集是一个二分类情感分类数据集,包含 25,000 条带情感标签的电影评论用于训练,另有 25,000 条用于测试:

图 7.1 – 情感分析在两个样本上的应用示例

图 7.1 – 在两个样本上使用情感分析的示例

类似于第四章中的 Reuters 示例,使用 AutoKeras 进行图像分类和回归,每个评论都被编码为一个单词索引列表(整数)。为了方便起见,单词根据其在数据集中的总体频率进行索引。例如,整数 3 表示数据中第三频繁出现的单词。

包含完整源代码的笔记本可以在github.com/PacktPublishing/Automated-Machine-Learning-with-AutoKeras/blob/main/Chapter07/Chapter7_IMDB_sentiment_analysis.ipynb找到。

现在,让我们详细查看笔记本中的相关单元格:

  • 安装 AutoKeras:正如我们在其他示例中提到的,笔记本顶部的这段代码负责使用 pip 包管理器安装 AutoKeras 及其依赖项:

    !pip3 install autokeras
    
  • 导入必要的包:以下几行代码加载 TensorFlow、内置的 Keras Reuters 数据集、NumPy 和 AutoKeras,作为本项目所需的依赖项:

    import tensorflow as tf
    import numpy as np
    import autokeras as ak
    
  • imdb_sentiment_raw 函数。查看笔记本中的代码以获取更多细节:

    (x_train, y_train), (x_test, y_test) = imdb_sentiment_raw()
    print(x_train.shape)  # (25000,)
    print(y_train.shape)  # (25000, 1)
    

    这是输出:

    (25000,)
    (25000, 1)
    
  • 展示一些样本:接下来,我们可以打印出第一个样本中的一些单词,了解其包含的内容:

    print(x_train[0][:50])
    

    这是输出:

    <START> vs from it as must exporters ability whole
    

为了更清楚地看到这一点,让我们渲染一个包含最常见单词的词云。词云(也称为标签云)是一种基于文本的数据可视化技术,其中单词根据其在文本中出现的频率显示为不同的大小:

图 7.2 – 包含数据集中最频繁单词的词云

图 7.2 – 包含数据集中最频繁单词的词云

现在,是时候创建分类器模型了。

创建情感预测器

现在,我们将使用 AutoKeras TextClassifier 来找到最佳的分类模型。为了这个示例,我们将 max_trials(最大尝试的 Keras 模型数量)设置为 2;我们不需要设置 epoch 参数;而是必须定义一个 EarlyStopping 回调,设置为 2 个 epoch,这样如果验证损失在连续两个 epoch 中没有改善,训练过程将停止:

clf = ak.TextClassifier(max_trials=2)
cbs = [tf.keras.callbacks.EarlyStopping(patience=2)]

让我们运行训练过程并为训练数据集寻找最佳分类器:

clf.fit(x_train, y_train, callbacks=cbs)

这是输出:

图 7.3 – 文本分类器训练的笔记本输出

图 7.3 – 文本分类器训练的笔记本输出

上述输出显示训练数据集的准确率在提高。

如我们所见,我们在验证集上得到了 0.28 的损失值。对于几分钟的训练来说,这还算不错。我们已经将搜索限制为两种架构(max_trials = 2)。像其他示例一样,增加此数字会给我们一个更准确的模型,但完成的时间也会更长。

评估模型

现在,是时候使用测试数据集评估最佳模型了:

clf.evaluate(x_test, y_test)

这是输出结果:

782/782 [==============================] - 41s 52ms/step - loss: 0.3118 - accuracy: 0.8724

[0.31183066964149475, 0.8723599910736084]

如我们所见,0.8724 是我们投入时间的一个非常好的最终预测准确度。

可视化模型

现在,我们可以查看最佳生成模型的架构简要概述:

model = clf.export_model()
model.summary()

这是输出结果:

图 7.4 – 最佳模型架构摘要

图 7.4 – 最佳模型架构摘要

如我们所见,AutoKeras 在第四章中所做的分类示例中,使用 AutoKeras 进行图像分类和回归,也选择了卷积模型(Conv1D)来执行此任务。正如我们在该章开头所解释的,当输入句子的顺序对预测不重要时,这种架构表现得非常好;不同电影评论之间没有相关性。

这是该架构的可视化表示:

图 7.5 – 最佳模型架构可视化图

图 7.5 – 最佳模型架构可视化图

如你所知,生成模型并选择最佳模型是由 AutoKeras 自动完成的,但让我们更详细地解释这些模块。

每个模块表示一个层,每个层的输出都连接到下一个层的输入,除了第一个模块,其输入是文本,以及最后一个模块,其输出是预测值。Conv1D 之前的模块都是数据预处理模块,负责将文本向量化生成嵌入,以便输入到 Conv1D 模块,并通过最大池化层减少滤波器的维度。请注意,AutoKeras 还添加了几个 dropout 模块来减少过拟合。

分析特定句子的情感

现在,让我们看一下来自测试集的一些预测样本:

import tensorflow as tf
tf.get_logger().setLevel('ERROR')
def get_sentiment(val):
    return "Positive" if val == 1 else "Negative"
for i in range(10):
    print(x_test[i])
    print("label: %s, prediction: %s" % (get_sentiment(y_test[i][0]), get_sentiment(clf.predict(x_test[i:i+1])[0][0])))

这是前面代码的输出结果:

图 7.6 – 基于测试数据集前 10 个句子的某些预测

图 7.6 – 基于测试数据集前 10 个句子的某些预测

如你所见,模型预测与测试数据集前 10 个样本的标签完全匹配。

摘要

在本章中,我们学习了情感分析在现实世界中的重要性,以及如何从文本数据中提取情感并在几行代码中实现情感预测器。

在下一章,我们将介绍一个非常有趣的话题:我们将使用 AutoKeras 通过文本分类器根据新闻内容来分类新闻话题。

第八章:第八章:使用 AutoKeras 进行主题分类

有时,我们需要将某些特定的文本(如产品或电影评论)分类到一个或多个类别中,方法是为其分配标签或主题。主题分类是一种监督式机器学习技术,正是用来完成这项工作的:预测给定文本属于哪个类别。作为一种监督式模型,它需要通过一组已经分类的训练数据进行训练,包括文本及其对应的类别。

本章将主要是实践性的,因为我们在前几章为基于文本的任务打下了基础。在本章结束时,您将学会如何使用 AutoKeras 创建主题分类器,并将其应用于任何基于主题或类别的数据集。

本章将涵盖以下主要主题:

  • 理解主题分类

  • 使用 AutoKeras 创建一个主题分类器

  • 自定义模型搜索空间

首先,让我们来看一下本章的技术要求。

技术要求

本书中的所有代码示例都可以作为 Jupyter 笔记本下载,地址为 github.com/PacktPublishing/Automated-Machine-Learning-with-AutoKeras

由于代码单元可以执行,因此每个笔记本都可以自我安装;只需添加所需的代码片段即可。因此,在每个笔记本的开头,都会有一个用于环境设置的代码单元,它会安装 AutoKeras 及其依赖项。

因此,要运行本章的代码示例,您只需要一台操作系统为 Ubuntu Linux 的计算机,并安装了 Jupyter Notebook,您可以通过以下代码行来安装:

$ apt-get install python3-pip jupyter-notebook

另外,您可以使用 Google Colaboratory 运行这些笔记本,在这种情况下,您只需要一个网页浏览器。详情请见 第二章使用 Google Colaboratory 的 AutoKeras。此外,在该章节的 安装 AutoKeras 部分,您将找到其他安装选项。

现在,让我们通过一些实际的示例,将所学知识付诸实践。

理解主题分类

我们在 第五章使用 AutoKeras 进行文本分类和回归 中,看到过一个简单的主题分类示例,其中有一个垃圾邮件分类器的例子。在那个例子中,我们从电子邮件内容中预测了一个类别(垃圾邮件/非垃圾邮件)。在这一节中,我们将使用类似的文本分类器,将每篇文章分类到其对应的主题中。通过这样做,我们将获得一个模型,能够确定每个新闻项对应的主题(类别)。

例如,假设我们的模型输入了以下标题:

"The match could not be played due to the eruption of a tornado"

这将输出 weathersports 主题,如下图所示:

图 8.1 – 新闻主题分类器工作流程

图 8.1 – 新闻主题分类器的工作流

上面的图表展示了主题分类器管道的简化版本。原始文本被分类器处理,输出将是一个或多个类别。

在本章后面,我们将应用文本分类器对路透社新闻线数据集进行处理,将每篇文章分配到 46 个类别中的一个或多个。大多数文本分类的概念已经在第五章《使用 AutoKeras 进行文本分类与回归》中讲解过,因此本章我们将通过实现主题分类器以实际方式回顾其中的一些概念。

创建新闻主题分类器

我们将要创建的模型将对路透社新闻线分类数据集的新闻进行分类。它将读取每篇新闻的原始文本,并将其分类到各个部分,为每个部分分配一个标签(例如:体育、天气、旅游等)。

路透新闻线是一个包含 11,228 条来自路透社的新闻数据集,按 46 个主题进行标注。

每篇新闻的文本被编码为一个单词索引列表。这些是按数据集中的频率索引的整数。因此,在这里,整数 1 编码数据中最常见的第一个单词,2 编码第二常见的单词,依此类推。

包含完整源代码的笔记本可以在 github.com/PacktPublishing/Automated-Machine-Learning-with-AutoKeras/blob/main/Chapter08/Chapter8_Reuters.ipynb 找到。

现在,让我们详细查看笔记本中的相关单元格:

  • 安装 AutoKeras:正如我们在前面的章节中提到的,笔记本顶部的这段代码负责使用 pip 包管理器安装 AutoKeras 及其依赖项:

    !pip3 install autokeras
    
  • tensorflow、内置的 Keras 路透社数据集加载到内存中,以及将 numpyAutoKeras 作为本项目所需的依赖项:

    import tensorflow as tf
    from tensorflow.keras.datasets import reuters 
    import numpy as np
    import autokeras as ak
    
  • reuters_raw 函数。查看笔记本中的代码以了解更多细节:

    (x_train, y_train), (x_test, y_test) = reuters_raw()
    print(x_train.shape)  # (8982,)
    print(y_train.shape)  # (8982, 1)
    

    这是前面代码的输出:

    Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/reuters.npz
    2113536/2110848 [==============================] - 0s 0us/step
    Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/reuters_word_index.json
    557056/550378 [==============================] - 0s 0us/step
    (8982,)
    (8982, 1)
    
  • 可视化数据集样本:接下来,我们可以打印出第一个样本中的一些单词,以了解其包含的内容:

    print(x_train[0][:50])
    

    这是前面代码的输出:

    <START> <UNK> <UNK> said as a result of its decemb
    

让我们看一下词云中最常见词语的分布。词云(也称为标签云)是一种基于文本的数据可视化技术,单词的显示大小取决于它们在文本中出现的频率:

图 8.2 – 新闻线数据集的词云

图 8.2 – 新闻线数据集的词云

现在,让我们创建新闻线分类器模型。

创建分类器

现在,我们将使用 AutoKeras 的 TextClassifier 来寻找最佳的分类模型。仅此示例,我们将 max_trials(尝试的不同 Keras 模型数量的最大值)设置为 2. 我们不会设置 epochs 参数,而是定义一个 EarlyStopping 回调,设定为 2 个 epoch。这样,训练过程将在验证损失连续两个 epoch 没有改善时停止:

clf = ak.TextClassifier(max_trials=2)
cbs = [tf.keras.callbacks.EarlyStopping(patience=2)]

让我们运行训练过程,寻找训练数据集的最佳分类器:

clf.fit(x_train, y_train, callbacks=cbs)

这是输出结果:

图 8.3 – 文本分类器训练的笔记本输出

图 8.3 – 文本分类器训练的笔记本输出

之前的输出显示了训练数据集的准确性在不断提高。

如我们所见,我们在验证集上达到了 0.965 的损失值。仅仅 1 分钟的训练时间就得到了一个非常不错的结果。我们将搜索限制为两种架构(max_trials = 2)。增加这个数字会给我们一个更精确的模型,尽管也会花费更多的时间。

评估模型

现在,是时候用测试数据集来评估最佳模型了:

Clf.evaluate(x_test, y_test)

这是输出结果:

71/71 [==============================] – 1s 7ms/step – loss: 0.9743 – accuracy: 0.7778
[0.9742580652236938, 0.777827262878418]

如我们所见,0.77(77%)是我们投入训练时间(不到几分钟)后得到的一个不错的最终预测得分。

可视化模型

现在,让我们来看一下最佳生成模型的架构简要总结:

Model = clf.export_model()
model.summary()

这是输出结果:

图 8.4 – 最佳模型架构总结

图 8.4 – 最佳模型架构总结

如我们所见,AutoKeras 已选择了一个卷积模型(Conv1D)来执行这个任务。正如我们在本章开头所解释的,当序列中元素的顺序对预测没有重要影响时,这种架构效果很好。

这是它的可视化表示:

图 8.5 – 最佳模型架构可视化

图 8.5 – 最佳模型架构可视化

评估模型

如你所知,生成模型并选择最佳模型是由 AutoKeras 自动完成的,但我们来更详细地解释这些模块。

每个模块代表一个层级,且每个模块的输出都与下一个模块的输入相连,除了第一个模块,其输入是文本,最后一个模块,其输出是预测的数字。在 Conv1D 之前的模块都是数据预处理模块,负责将文本向量化,生成嵌入以供 Conv1D 模块使用,并通过最大池化层减少滤波器的维度。请注意,AutoKeras 还添加了几个 dropout 模块以减少过拟合。

自定义模型搜索空间

我们可以通过使用 AutoModel 替代 TextClassifier 来自定义模型的搜索空间,例如,通过为某些特定配置设置 TextBlock

在以下代码片段中,我们告诉 AutoKeras 只生成使用'ngram'来向量化句子的模型。记住,如果我们没有指定这些参数,AutoKeras 将自动尝试所有可能的组合,直到数量达到max_trial参数所设定的值:

input_node = ak.TextInput()
output_node = ak.TextBlock(block_type="ngram")(input_node)
output_node = ak.ClassificationHead()(output_node)
clf = ak.AutoModel(inputs=input_node, 
                   outputs=output_node, overwrite=True,
                   max_trials=1)
clf.fit(x_train, y_train, epochs=2)

现在,让我们总结一下本章所学内容。

总结

在本章中,我们学习了如何通过实现一个高性能的文本分类器来解决一个主题分类任务,该分类器可以在仅仅几行代码的情况下对新闻文章进行分类。

现在我们已经为处理文本打下了基础,接下来我们可以进入下一章,在那里你将学习如何使用 AutoKeras 处理多模态和多任务数据。

第三部分:高级 AutoKeras

在本节中,您将学习一些 AutoKeras 的高级概念,包括处理多模态数据和多任务、使用 AutoModel 定制模型、导出/部署模型,以及使用 AutoKeras 扩展功能。

本节包括以下章节:

  • 第九章*,处理多模态数据和多任务*

  • 第十章*,导出与可视化模型*

第九章:第九章:处理多模态和多任务数据

在本章中,我们将学习如何使用 AutoModel API 来处理多模态和多任务数据。

到本章结束时,你将学会如何使用创建具有多个输入和多个输出的模型所需的概念和工具。你将能够通过从头开始创建模型或将本章展示的实际示例适应其他相似数据集,将这些概念应用到自己的项目中。

在本章中,我们将讨论以下主题:

  • 探索具有多个输入或输出的模型

  • 创建一个多任务/多模态模型

  • 自定义搜索空间

但首先,让我们解释一下本章的技术要求。

技术要求

本书中的所有代码示例都可以作为 Jupyter 笔记本下载,下载地址是github.com/PacktPublishing/Automated-Machine-Learning-with-AutoKeras

由于代码单元可以执行,因此每个笔记本都可以自我安装;只需添加包含所需依赖项的代码片段。因此,在每个笔记本的开头,都有一个用于环境设置的代码单元,用来安装 AutoKeras 及其依赖项。

因此,为了运行本章中的代码示例,你只需要一台运行 Ubuntu Linux 操作系统的计算机,并且必须通过以下代码行安装 Jupyter Notebook:

$ apt-get install python3-pip jupyter-notebook

另外,你也可以使用 Google Colaboratory 运行这些笔记本,在这种情况下,你只需要一个网页浏览器。有关详细信息,请参见第二章AutoKeras 与 Google Colaboratory。此外,在该章节的安装 AutoKeras部分,你将找到其他安装选项。

现在,让我们通过一个实际示例来实践在介绍中提到的这些概念。

探索具有多个输入或输出的模型

正如我们稍后将看到的,有时我们可能希望我们的模型同时获取来自不同来源的信息(多模态)和/或同时预测多个目标(多任务)。AutoKeras 有一个叫做AutoModel的类,允许我们将多个来源和目标定义为一组参数列表。在看实际示例之前,让我们稍微深入了解一下这个内容。

什么是 AutoModel?

AutoModel 是一个类,允许我们通过定义不仅是输入和输出,还包括其内部层来精细地定义模型。

它可以通过两种不同的方式使用:

  • 基本:在这里,输入/输出节点被指定,AutoModel 推断模型的其余部分。

  • 高级:在这里,高级架构通过使用功能 API 连接各层(模块)来定义,这与 Keras 的功能 API 相同。

让我们看一下每个示例。

基本示例

用户只需指定输入节点和输出头:

import autokeras as ak
ak.AutoModel(
    inputs=[ak.ImageInput(), ak.TextInput()],
    outputs[ak.ClassificationHead(), ak.RegressionHead()])

接下来,让我们看一个高级示例。

高级示例

用户指定高级架构:

import autokeras as ak
image_input = ak.ImageInput()
image_output = ak.ImageBlock()(image_input)
text_input = ak.TextInput()
text_output = ak.TextBlock()(text_input)
output = ak.Merge()([image_output, text_output])
classification_output = ak.ClassificationHead()(output)
regression_output = ak.RegressionHead()(output)
ak.AutoModel(
   inputs=[image_input, text_input],
   outputs=[classification_output, regression_output])

在前面的代码中,我们配置了 AutoModel 以创建一个具有多个输入(多模态)和多个输出(多任务)的模型。接下来,我们将解释这些概念,并通过创建自己的多模态模型来实际应用它们。

什么是多模态?

我们称数据为多模态数据,当每个数据实例包含多种信息形式时。例如,我们可以将一张照片保存为图像,但除了这张图像,它还包含关于拍摄地点的信息。这些元信息可以视为结构化数据。

什么是多任务?

我们称一个模型为多任务模型,当它使用相同的输入特征预测多个目标时。例如,假设我们想按族群分类人物照片,同时还希望指定其年龄,年龄范围为 0 到 100。

下图展示了一个多模态和多任务神经网络模型的示例:

图 9.1 – 多模态和多任务神经网络模型示例

图 9.1 – 多模态和多任务神经网络模型示例

在这里,我们可以看到有两个条目:图像ImageInput)和结构化数据StructuredDataInput)。每个图像都与结构化数据中的一组属性相关联。通过这些数据,我们可以尝试同时预测分类标签ClassificationHead)和回归值RegressionHead)。

让我们通过实际示例更详细地了解这些概念。

创建一个多任务/多模态模型

基于本章开头提供的示例,我们将创建一个模型,该模型将图像及其结构化数据属性作为输入,并预测一个类别值和一个标量值。在这种情况下,我们将不使用现有数据集,而是生成我们自己的数据。我们将使用的笔记本,包含完整的源代码,可以在 github.com/PacktPublishing/Automated-Machine-Learning-with-AutoKeras/blob/main/Chapter09/Chapter9_MultiModel.ipynb 上找到。

现在,让我们详细查看笔记本中的相关单元格:

  • 安装 AutoKeras:正如我们在前几章中提到的,笔记本顶部的这段代码负责使用 pip 包管理器安装 AutoKeras 及其依赖项:

    !pip3 install autokeras
    
  • numpyAutoKeras 是该项目所需的依赖项:

    import numpy as np
    import autokeras as ak
    
  • 创建数据集:首先,我们将通过生成随机图像和结构化数据作为多模态数据来创建数据集:

    import numpy as npnum_instances = 100
    image_data = np.random.rand(num_instances, 32, 32, 3).astype(np.float32)
    structured_data = np.random.rand(num_instances, 20).astype(np.float32)
    

    现在,生成一些用于分类和回归的多任务目标:

    regression_target = np.random.rand(num_instances, 1).astype(np.float32)
    classification_target = np.random.randint(5, size=num_instances)
    

现在,是时候创建模型了。

创建模型

现在,我们将使用AutoModel创建模型,首先是基本配置,然后是高级配置。与之前的示例一样,我们将设置较小的max_trialsepochs,以避免训练过程花费太长时间。

首先,我们将使用多个输入和输出初始化模型:

import autokeras as akmodel = ak.AutoModel(
    inputs=[ak.ImageInput(), ak.StructuredDataInput()],
    outputs=[
        ak.RegressionHead(metrics=['mae']),
        ak.ClassificationHead(loss='categorical_crossentropy', metrics=['accuracy'])
    ],
    overwrite=True,
    max_trials=2)

在之前的代码中,我们定义了两个输入(图像和结构化数据)和两个输出(回归和分类)。在这里,我们告诉模型,我们希望同时使用回归器和分类器来训练输入数据。

现在,让我们运行训练过程,以搜索适合训练数据集的最佳模型:

model.fit(
    [image_data, structured_data],
    [regression_target, classification_target],
    epochs=3)

这是输出结果:

图 9.2 – 模型训练的笔记本输出

图 9.2 – 模型训练的笔记本输出

与之前的示例不同,在这里,我们可以看到输出显示了两个损失值——一个用于回归器,另一个用于分类器。在这种情况下,数据是随机生成的,因此没有必要关注性能评估。

可视化模型

现在,让我们看看最佳生成模型的架构摘要:

keras_model = model.export_model()
keras_model.summary()

这是输出结果:

图 9.3 – 最佳模型架构总结

图 9.3 – 最佳模型架构总结

让我们简要描述一下用于该模型的各个模块。

在这种情况下,AutoKeras 创建了两个子模型——每个输入数据对应一个子模型。它选择了一个深度残差网络架构(resnet50),该架构我们已经在第四章中介绍过,使用 AutoKeras 进行图像分类和回归,用于处理图像数据,以及几个全连接层用于处理结构化数据。在消化了这两种数据源之后,两个子模型的结果被连接起来,再分开生成两个不同的输出(一个标量值和一个分类值)。

这里是该过程的可视化表示:

图 9.4 – 最佳模型架构可视化

图 9.4 – 最佳模型架构可视化

现在,让我们在更高级的模式下使用 AutoModel,定制中间模块。

定制搜索空间

正如我们在本章开头提到的,使用 AutoModel 有一种高级方式。我们可以通过使用功能性 API 来定义整个模型架构,将层(模块)连接起来,这与 Keras 的功能性 API 相同。

让我们在以下示例中进行操作:

input_node1 = ak.ImageInput()
output_node = ak.Normalization()(input_node1)
output_node = ak.ImageAugmentation()(output_node)
output_node1 = ak.ConvBlock()(output_node)
output_node2 = ak.ResNetBlock(version='v2')(output_node)
output_node1 = ak.Merge()([output_node1, output_node2])

input_node2 = ak.StructuredDataInput()
output_node = ak.CategoricalToNumerical()(input_node2)
output_node2 = ak.DenseBlock()(output_node)

output_node = ak.Merge()([output_node1, output_node2])
output_node1 = ak.ClassificationHead()(output_node)
output_node2 = ak.RegressionHead()(output_node)

model = ak.AutoModel(
    inputs=[input_node1, input_node2], 
    outputs=[output_node1, output_node2],
    overwrite=True,
    max_trials=2)

model.fit(
    [image_data, structured_data],
    [classification_target, regression_target],
    batch_size=32,
    epochs=3)

在这里,我们通过将一个模块的输出连接到下一个模块的输入,按顺序定义了每个模块。在这种情况下,我们通过添加一些图像预处理模块来进行定制,目的是进行归一化和数据增强。我们还将一个卷积层与 ResNet 层并行放置,以训练图像数据,该层也已进行定制。你甚至可以指定要使用的 ResNet 架构版本。

尽管这种模式更复杂,但它更强大且更灵活。请注意,你甚至可以指定想要使用的 ResNet 架构版本(v2)。需要注意的是,对于那些未自定义的参数(如版本),AutoKeras 会尝试不同的值组合,以找到最优解。

总结

在本章中,我们学习了什么是多任务模型,什么是多模态模型,以及如何使用强大的 AutoModel 类创建具有多个输入和输出的高效模型。现在,你已经准备好将这些概念应用到自己的多模态项目中,可以从头开始创建,或者通过调整这个实用示例来适应你自己的数据集。

在下一章中,我们将学习如何导出我们的模型,以及如何使用一个强大的可视化工具来实时跟踪和可视化诸如损失和准确率等指标的图形。

第十章:第十章:导出与可视化模型

在本章中,我们将学习如何导出和导入我们的 AutoKeras 模型。训练完成后,我们还将学习如何以图形方式实时可视化模型训练过程中发生的事情。

完成本章后,您将能够将模型导出和导入到磁盘,并且您将拥有一个强大的可视化工具,帮助您了解在模型训练过程中发生的情况。

本章将重点讲解以下要点:

  • 导出您的模型:如何从磁盘保存和加载模型

  • 使用 TensorBoard 可视化您的模型:如何使用这个强大的工具实时可视化您的模型

  • 使用 ClearML 可视化和比较您的模型

让我们从第一点开始,但首先像往常一样确保我们已经安装了所有的要求。

技术要求

本书中的所有编码示例均以 Jupyter 笔记本形式提供,可以从以下网站下载:github.com/PacktPublishing/Automated-Machine-Learning-with-AutoKeras

由于代码单元可以执行,每个笔记本都可以自我安装,您只需添加包含所需要求的代码片段。因此,在每个笔记本的开始部分,都会有一个代码单元用于环境设置,安装 AutoKeras 及其依赖项。

因此,为了运行编码示例,您只需要一台运行 Ubuntu Linux 操作系统的计算机,并可以使用以下命令安装 Jupyter notebook:

$ apt-get install python3-pip jupyter-notebook

另外,您也可以使用 Google Colaboratory 运行这些笔记本。在这种情况下,您只需要一个网页浏览器;有关详细信息,请参阅第二章中的AutoKeras 与 Google Colaboratory部分,AutoKeras 入门。此外,在主要章节安装 AutoKeras中,您还可以找到其他安装选项。

现在,让我们通过一个实际示例将上一节中的概念付诸实践。

导出模型

AutoKeras 找到的最佳模型可以轻松导出为 Keras 模型。

在将模型保存到磁盘时,可以选择两种不同的格式:TensorFlow SavedModel 格式和较旧的 Keras H5 格式。推荐使用 SavedModel 格式,这是我们调用model.save()时的默认选项。

如何保存和加载模型

现在,让我们一步步来看如何导出和恢复模型:

  1. 使用以下代码块将模型导出为 Keras 模型:

    model = my_autokeras_model.export_model() 
    

    现在,尝试使用 h5 格式作为备份保存为 TensorFlow 格式,因为出现了问题:

    try:
        model.save("model_autokeras", save_format="tf")
    except:
        model.save("model_autokeras.h5")
    
  2. 使用以下代码块重新加载模型:

    from tensorflow.keras.models import load_model
    loaded_model = load_model("model_autokeras", custom_objects=ak.CUSTOM_OBJECTS)
    

代码几乎不需要解释,但我们将详细说明加载功能。在这个函数中,负责将模型从磁盘加载到内存中,我们将 ak.CUSTOM_OBJECTS 作为 custom_objects 参数传递。这告诉 Keras 函数我们要加载的模型具有自定义的 AutoKeras 对象。

一旦我们知道如何导入和导出模型,就该进入下一部分,在这一部分中,我们将学习在训练过程中进行可视化。这将帮助我们从学习过程提取观点。

使用 TensorBoard 可视化你的模型

为了开发高效且成功的模型,你需要了解实验过程中发生的事情,以便尽早反应,修正可能的异常或不想要的结果,例如过拟合和学习缓慢。这就是触觉回调概念发挥作用的地方。

回调是一个对象(实现特定方法的类实例),它在调用拟合时传递给模型,并且在训练过程中模型会在不同的时刻调用它。你可以访问模型状态和性能的所有可用数据,并根据这些数据采取以下措施:

  • 中断训练,因为你已经停止学习或正在过拟合

  • 保存模型;这样,训练可以从保存的点在未来恢复

  • 记录度量指标,例如精度或损失

  • 更改其状态,并修改其结构或超参数,例如学习率

以下是使用回调的一些示例:

  • 模型检查点:在训练过程中的不同点保存当前模型的权重。

  • 提前停止:当验证的损失不再改善时中断训练(并且当然保存训练过程中获得的最佳模型)。

  • 在训练过程中动态调整某些参数的值,例如学习率。

  • 在训练过程中记录训练和验证指标,或查看模型学习的表示方式,随着更新而变化。

有两个特别有用的回调函数用于训练,EarlyStoppingModelCheckpoint。第一个用于在观察到的指标停止改进时中断训练,直到初始设置的次数。例如,使用此回调可以在开始过拟合时中断训练,从而避免需要用更少的轮次重新训练模型。这个回调通常与 ModelCheckpoint 一起使用,后者允许在训练过程中不断保存模型。

图 10.1 – 使用回调训练模型的示例

图 10.1 – 使用回调训练模型的示例

AutoKeras 会在训练过程中始终保存最好的模型,并默认使用 EarlyStopping,设定的 epoch 数量根据我们训练的模型类型而有所不同。不过,这种行为可以通过回调函数的 fit 参数进行自定义。

使用回调函数记录模型状态

记录指标的回调函数对于监控至关重要,因为它们允许像 TensorBoard 这样的工具实时可视化模型在训练过程中的学习进展,正如我们在这里所看到的。

因此,在我们的案例中,我们将设置回调函数来记录训练进度,使用以下命令:

logdir = os.path.join("logs", datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))
tensorboard_callback = tf.keras.callbacks.TensorBoard(logdir, histogram_freq=1)

在之前的代码中,我们定义了一个日志目录(log_dir),并创建了一个回调函数将模型检查点保存到该目录,这意味着 AutoKeras 会自动将每个 epoch 的指标保存到该文件夹中的多个日志文件中。我们还激活了直方图(histogram_freq=1),因此在 TensorBoard 的直方图标签中,你可以查看每一层的激活值的直方图。

在下一节中,我们将使用 TensorBoard 可视化日志,它是一个用于查看 TensorFlow 模型信息的 web 应用。由于 AutoKeras 是基于 TensorFlow 的,我们可以通过这种简单方式使用该工具来可视化我们的模型。

设置和加载 TensorBoard

TensorBoard 允许我们实时可视化不同的指标,例如损失和精度,同时渲染模型图(按层和操作分层),并显示权重、偏置或其他张量的直方图。

TensorBoard 可以直接在 Jupyter notebook 和 Colab 中使用。通过在 notebook 中加载 TensorBoard 扩展,可以实现这一功能。这是我们在本章中将采用的方法。

注意

如果你已经在同一个虚拟环境中安装了 Jupyter 和 TensorBoard,那么应该可以直接使用。如果你使用的是更复杂的设置,例如全局安装了 Jupyter 并为不同的 Conda/virtualenv 环境配置了内核,那么你需要确保 TensorBoard 二进制文件在 Jupyter notebook 的上下文中已经添加到 PATH

首先,我们需要设置 callbacks,正如在上一节中解释的那样,记录训练进度到 logs 目录:

logdir = os.path.join("logs", datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))
tensorboard_callback = tf.keras.callbacks.TensorBoard(logdir)

现在我们将 callbacks 传递给训练函数:

model.fit(x_train, 
        y_train,
        epochs=1, 
        callbacks=[tensorboard_callback])

一旦训练完成,我们就可以加载 tensorboard 扩展来可视化结果:

%load_ext tensorboard
%tensorboard --logdir logs

上述代码行加载了 TensorBoard 仪表板,并将模型的 logs 目录作为输入:

图 10.2 – TensorBoard 显示模型训练结果

图 10.2 – TensorBoard 显示模型训练结果

在之前的截图中,有两个图形,每个图形上有四条不同的线,表示两个候选模型的学习进度。

在第一个图中,两个最高的曲线分别显示了训练集和验证集的 epoch 精度,而较低的曲线则显示了另一个模型在训练集和验证集上的精度。

第二个图表中也发生了类似的情况,但在这种情况下,它表示的是损失值,而不是准确率。

我们还可以在 GRAPHS 标签页中看到模型的各个元素。GRAPHS 标签页显示了一个交互式低级 TensorFlow 图,展示了你的 AutoKeras 模型使用的特征:

图 10.3 – TensorBoard 显示模型图

](tos-cn-i-73owjymdk6/a49781495ba04a278825e388a29c0b69)

图 10.3 – TensorBoard 显示模型图

在前面的截图中,我们可以看到模型图的一部分,以及它的不同层和操作。正如你所看到的,模型比你预期的要复杂得多。当你定义分类器时,代码只有三行,但在幕后,AutoKeras 构建了一个相当复杂的图结构来使其工作。

在这里,我们还可以可视化不同层中的权重/偏差分布:

图 10.4 – TensorBoard 显示模型层的分布

](tos-cn-i-73owjymdk6/3e8c2b0b9a20406fa83b2f93f951a2c2)

图 10.4 – TensorBoard 显示模型层的分布

还有许多其他可用的选项,我们在此不做详细解释。TensorBoard 是一个非常强大且完整的工具,它的功能范围超出了本书的讨论。以下网址是一个很好的起点:www.tensorflow.org/tensorboard/get_started

现在,让我们在下一节中看看如何将我们的实验分享给全世界。

使用 TensorBoard.dev 分享你的 ML 实验结果

TensorBoard.dev 是一个免费的公共服务,允许你上传 TensorBoard 记录并获得一个永久链接,可以与任何人分享,同时也可以用于你的学术文章、博客、社交媒体等。这可以提高实验的可重复性和协作性。

你可以通过运行以下命令简单地使用 TensorBoard.dev:

!tensorboard dev upload \
  --logdir logs/fit \
  --name "(optional) My latest AutoKeras experiment" \
  --description "(optional) Simple comparison of several hyperparameters" \
  --one_shot

上面的命令会将模型的 logs 目录上传到 TensorBoard.dev:

New experiment created. View your TensorBoard at: https://tensorboard.dev/experiment/TPcKbLPeRAqZ1GmRWDAdow/

现在,点击链接将会打开一个浏览器,在其中我们可以看到 TensorBoard 面板,网址显示为 TensorBoard.dev 网站,如下所示:

图 10.5 – 在 TensorBoard.dev 上分享的模型训练结果

图 10.5 – 在 TensorBoard.dev 上分享的模型训练结果

正如我们所看到的,TensorBoard 是一个非常强大的工具,用于监控你的模型,但如果你需要追踪实验结果,并与其他团队进行比较和共享,那么有一个名为 ClearML 的 AutoKeras 扩展专门用于监控和追踪实验,它允许访问 TensorBoard 日志,并为其补充了许多额外的功能。我们将在下一节中详细了解这一点。

使用 ClearML 可视化和比较你的模型

ClearML(前身为 Trains)是一个完整的开源 ML/DL 实验解决方案,它会自动跟踪你需要的所有内容,帮助你记录工作、可视化结果,并通过直观的 Web 界面重现、调整和比较实验。

ClearML 允许你执行以下任务:

  • 在 ClearML Web UI 中可视化实验结果。

  • 跟踪并上传模型。

  • 跟踪模型性能并创建跟踪排行榜。

  • 重新运行实验,在任何目标机器上重现实验,并调整实验。

  • 比较实验。

要在你的 AutoKeras 项目中使用它,你只需要在代码中初始化一个 ClearML 任务,ClearML 会自动记录报告给 TensorBoard、Matplotlib、Plotly 和 Seaborn 的标量、图形和图像,以及你添加到代码中的所有其他自动日志和显式报告。

将 ClearML 添加到代码中

只需将这两行代码添加到你的项目中:

from clearml import Task
task = Task.init(project_name="myAutokerasProject", task_name="myAutokerasExperiment")

当代码运行时,它会在 ClearML 服务器中初始化一个任务,并在控制台输出指向实验日志的超链接:

CLEARML Task: created new task id=c1f1dc6cf2ee4ec88cd1f6184344ca4e
CLEARML results page: https://app.clearml-master.hosted.allegro.ai/projects/1c7a45633c554b8294fa6dcc3b1f2d4d/experiments/c1f1dc6cf2ee4ec88cd1f6184344ca4e/output/log

ClearML 会检查 AutoKeras 的训练过程,查找 TensorBoard 回调函数,以及任何类型的输出,包括日志、指标、图像等。

在生成的实验链接中,你可以实时查看与 AutoKeras 自动生成的模型相关的仪表板,这些仪表板包含不同的图表。这些图表会在训练过程中生成,并且可以看到它们的准确性、在训练和评估数据集上的表现、控制台输出以及更多的指标:

图 10.6 – ClearML 仪表板显示 TensorBoard 指标

图 10.6 – ClearML 仪表板显示 TensorBoard 指标

在之前的截图中,我们可以看到我们的模型在各个训练轮次中的精度和损失变化,在接下来的截图中,我们可以看到其中一个卷积层的权重分布:

图 10.7 – ClearML 仪表板显示一些模型层分布

图 10.7 – ClearML 仪表板显示一些模型层分布

在之前的截图中,我们可以看到类似于之前 TensorBoard 仪表板中的 ClearML 面板。

AutoKeras 在训练过程中会生成多个模型,所以让我们看看 ClearML 如何同时展示每个模型的结果。

比较实验

使用此工具,你还可以强有力地比较实验并对比结果。有许多比较选项,例如比较模型工件、超参数、数据系列图和每次迭代的调试样本。它还允许你使用查看器(用于图像和视频)和播放器(用于音频)浏览样本:

图 10.8 – ClearML 仪表板比较两个模型的训练结果

](tos-cn-i-73owjymdk6/820abeccd4bb4937b4916488ffa7bab9)

图 10.8 – ClearML 仪表板比较两个模型的训练结果

这些选项的详细信息以及更多内容可以在 ClearML Web UI 文档中找到。

摘要

在本章中,我们学习了如何定义 Keras 回调函数以在训练过程中监控模型,如何使用 TensorBoard 查看直方图、模型图表和其他许多指标,并且如何使用 ClearML 扩展来监控和跟踪实验。

使用这些新工具,你将能更好地在现实世界中构建深度学习模型并调试潜在的问题。

本书中,我们学习了使用 AutoKeras 解决基于文本、图像或结构化数据的任务所需的基本概念,以及本章中看到的可视化技术。AutoKeras、Keras 和 TensorFlow 都有出色的文档,你可以根据需要深入研究。基础已经打好,现在是时候完成建设了。

最后的几句话

这就是*《使用 AutoKeras 进行自动化机器学习》*的结束!我希望你已经学会了,它将帮助你实现自己的 AI 项目,或者提升你已有的项目,特别是在 AI 领域,每天都有新的概念诞生。因此,我鼓励你继续前行,深入探索这个令人兴奋的世界,享受每一步。

在西班牙的圣地亚哥之路上,经常有一句话被反复提到:“旅行者,路并不存在。路是走出来的。”

我希望这本书能作为一个起点,帮助你继续走这条路。