Auto-Keras与AutoML:入门指南

yangzzguang 2019-06-30

摘要: 不会机器学习?不会人工智能?没关系!自动化程序来了!

Auto-Keras与AutoML:入门指南

在本教程中,你将学习如何使用Auto-Keras(Google的AutoML的开源替代品)来实现自动化机器学习和深度学习。

目前来说,深度学习从业者在数据集上训练神经网络时,主要正在尝试优化和平衡两个目标:

1.定义适合数据集性质的神经网络体系结构;

2.在许多实验中调整一组超参数,这将导致模型具有高精度并能够推广到训练和测试集之外的数据。需要调整的典型超参数包括优化算法(SGD,Adam等),学习速率和学习速率调度以及正则化等。

根据数据集和具体问题,深度学习专家可以进行数十到数百次实验,以找到神经网络架构和超参数之间的平衡,这些实验通常需要计算数百到数千小时。

刚刚提到的这种模式仅适用于专家,那非深度学习专家呢?

这就需要Auto-Keras和AutoML:

Auto-Keras和AutoML的最终目标是通过使用自动神经架构搜索(NAS)算法降低进入机器学习和深度学习的门槛。Auto-Keras和AutoML使非深度学习专家能够以最小的深度学习领域知识或实际数据来训练他们自己的模型。具有最小机器学习专业知识的程序员可以使用AutoML和Auto-Keras并应用这些算法,只需很少的努力即可实现最先进的性能。

听起来好得令人难以置信?

也许你需要好好阅读这篇文章的其余部分以找出原因。

Auto-Keras和AutoML:入门指南

在本博文的第一部分中,我们将讨论自动机器学习(AutoML)和神经架构搜索(NAS),这种算法使得AutoML在应用于神经网络和深度学习时成为可能。我们还将简要讨论Google的AutoML,这是一套工具和库,允许具有有限机器学习专业知识的程序员在自己的数据上训练高精度模型。

当然,谷歌的AutoML是一种专有算法,AutoML的另一种选择是开源Auto-Keras、它是围绕Keras和PyTorch而构建。

然后,我将向你展示如何使用Auto-Keras自动训练网络以及评估它。

什么是自动机器学习(AutoML)?

Auto-Keras与AutoML:入门指南

Auto-Keras是Google AutoML的替代品。它可以帮助你自动训练模型,几乎不需要干预。对于新手深度学习从业者来说,它们是很好的选择。

在无监督学习之外,非专家的自动机器学习被认为是机器学习的“圣杯”。

想象一下通过以下方式自动创建机器学习模型的能力:

1.安装库/使用Web界面;

2.将库/接口指向你的数据;

3.自动训练数据模型而无需调整参数/需要深入了解为其提供动力的算法;

一些公司正试图创建这样的解决方案,其中一个就是谷歌的AutoML。Google AutoML使非常有限的机器学习经验的开发人员和工程师能够自动在他们自己的数据集上训练神经网络。

谷歌的底层AutoML算法是迭代的:

1.在训练集上训练网络;

2.在测试集上评估网络;

3.修改神经网络架构;

4.调整超参数;

5.重复上述过程;

使用AutoML的程序员或工程师不需要定义他们自己的神经网络架构或调整超参数,AutoML会自动为他们做这件事。

神经架构搜索(NAS)使AutoML成为可能

Auto-Keras与AutoML:入门指南

神经架构搜索(NAS)在搜索CIFAR-10的最佳CNN架构时,通过这些图表生成了一个模型。

Google的AutoML和Auto-Keras都采用了一种称为神经架构搜索(NAS)的算法。根据你的输入数据集,神经架构搜索算法将自动搜索最佳架构和相应参数。神经架构搜索基本上是用一组自动调整模型的算法取代深度学习工程师/从业者!

在计算机视觉和图像识别的背景下,神经架构搜索算法将:

1.接受输入训练数据集;

2.优化并找到称为“单元”的架构构建块,然后让这些单元自动学习,这可能看起来类似于初始化,残留或激活微架构;

3.不断训练和搜索“NAS搜索空间”以获得更优化的单元;

如果AutoML系统的用户是经验丰富的深度学习从业者,那么他们可能会决定:

1.在训练数据集的一个非常小的子集上运行NAS;

2.找到一组最佳的架构构建块/单元;

3.获取这些单元并手动定义在体系结构搜索期间找到的更深层次的网络版本;

4.使用自己的专业知识和最佳实践,在完整的培训集上训练网络;

这种方法是全自动机器学习解决方案与需要专家深度学习实践者的解决方案之间的混合体,通常这种方法比NAS自己训练的模型性能更好。

Auto-Keras:谷歌AutoML的开源替代品

Auto-Keras与AutoML:入门指南

Auto-Keras包是由在德克萨斯州A&M大学数据实验室团队开发。Auto-Keras是Google AutoML的开源替代品。

Auto-Keras依然是利用神经架构搜索,但应用“网络态射”(在更改架构时保持网络功能)以及贝叶斯优化,以指导网络态射以实现更高效的神经网络搜索。你可以在Jin等人的2018年出版物Auto-KerasEfficient Neural Architecture Search with Network Morphism找到Auto-Keras框架的全部细节。

安装Auto-Keras:

Auto-Keras与AutoML:入门指南

正如Auto-Keras GitHub存储库所述,Auto-Keras处于“预发布”状态-它现在还不是正式版本。其次,Auto-Keras需要Python 3.6并且只与Python 3.6兼容。如果你使用的*是3.6以外的任何其他版本的Python,你将无法使用Auto-Keras软件包。

如果你想要检查Python版本,只需使用以下命令:

python --version

如果你有Python 3.6,你可以使用pip安装Auto-Keras:

pip install tensorflow # or tensorflow-gpu

pip install keras
pip install autokeras

使用Auto-Keras实现我们的训练脚本:

让我们继续使用Auto-Keras实现我们的训练脚本,打开train_auto_keras.py文件并插入以下代码:

# import the necessary packages
from sklearn.metrics import classification_report
from keras.datasets import cifar10
import autokeras as ak
import os

def main():
    # initialize the output directory
    OUTPUT_PATH = "output"

首先,我们在第2-5行导入必要的包:

  • 如前所述,我们将使用scikit-learn的classification_report来计算我们将在输出文件中保存的统计信息。
  • 我们将使用CIFAR-10数据集,因为它已经被内置到keras.datasets。
  • 然后是导入import依赖项-autokeras,我已经将它用AK的简写代替。
  • 该os模块是必需的,因为我们会在建立输出文件的路径时,在各种操作系统上容纳路径分隔符。

我们在第7行定义脚本的主要功能,由于Auto-Keras和TensorFlow处理线程的方式,我们需要将代码包装在main函数中。有关更多详细信息,请参阅此GitHub问题线程

现在让我们初始化Auto-Keras的训练时间列表:

# initialize the list of training times that we'll allow
    # Auto-Keras to train for
    TRAINING_TIMES = [
        60 * 60,        # 1 hour
        60 * 60 * 2,    # 2 hours
        60 * 60 * 4,    # 4 hours
        60 * 60 * 8,    # 8 hours
        60 * 60 * 12,    # 12 hours
        60 * 60 * 24,    # 24 hours
    ]

上述代码是限定了一组训练-TIMES,包括[1,2,4,8,12,24]小时。我们将使用Auto-Keras来探索更长的训练时间对精确度的影响。

让我们加载CIFAR-10数据集并初始化类名:

# load the training and testing data, then scale it into the
    # range [0, 1]
    print("[INFO] loading CIFAR-10 data...")
    ((trainX, trainY), (testX, testY)) = cifar10.load_data()
    trainX = trainX.astype("float") / 255.0
    testX = testX.astype("float") / 255.0

    # initialize the label names for the CIFAR-10 dataset
    labelNames = ["airplane", "automobile", "bird", "cat", "deer",
        "dog", "frog", "horse", "ship", "truck"]

我们的CIFAR-10数据被加载并存储在第25行的训练/测试分组中。随后,我们将这个数据缩放到[0,1]的范围。接着我们会初始化我们的类labelNames,这10个类包含在CIFAR-10中。请注意,标签在这里很重要。

现在让我们开始循环遍历我们的TRAINING_TIMES,每次都使用Auto-Keras:

# loop over the number of seconds to allow the current Auto-Keras
    # model to train for
    for seconds in TRAINING_TIMES:
        # train our Auto-Keras model
        print("[INFO] training model for {} seconds max...".format(
            seconds))
        model = ak.ImageClassifier(verbose=True)
        model.fit(trainX, trainY, time_limit=seconds)
        model.final_fit(trainX, trainY, testX, testY, retrain=True)

        # evaluate the Auto-Keras model
        score = model.evaluate(testX, testY)
        predictions = model.predict(testX)
        report = classification_report(testY, predictions,
            target_names=labelNames)

        # write the report to disk
        p = os.path.sep.join(OUTPUT_PATH, "{}.txt".format(seconds))
        f = open(p, "w")
        f.write(report)
        f.write("\nscore: {}".format(score))
        f.close()

上面的代码块是今天脚本的核心。在第35行我们在每个TRAINING_TIMES上定义了一个循环,我们在其中做以下操作:

  • 初始化我们的模型(AK.ImageClassifier),并让训练开始。请注意,我们并没有实例化一个特定对象的CNN类,我们也没有调整超参数。因为Auto-Keras会为我们处理所有这些。
  • 一旦达到时间限制,请采用Auto-Keras找到的最佳模型和参数+重新训练模型。
  • 评估和构建分类报告。
  • 将分类报告与准确度分数一起写入磁盘,以便我们评估更长训练时间的影响。

我们将为每个TRAINING_TIMES重复此过程。

最后,我们将检查并启动执行的主线程:

# if this is the main thread of execution then start the process (our
# code must be wrapped like this to avoid threading issues with
# TensorFlow)
if __name__ == "__main__":
    main()

这里我们检查确保这是执行的主线程,然后是主函数。仅仅60行代码,我们就完成了使用CIFAR-10示例脚本编写Auto-Keras,但是我们还没有完成......

使用Auto-Keras训练神经网络

让我们继续使用Auto-Keras训练我们的神经网络。

请确保使用本教程的“下载”部分下载源代码。

从那里打开终端,导航到下载源代码的位置,然后执行以下命令:

$ python train_auto_keras.py
[INFO] training model for 3600 seconds max...   
Preprocessing the images.
Preprocessing finished.

Initializing search.
Initialization finished.

+----------------------------------------------+
|               Training model 0               |
+----------------------------------------------+
Using TensorFlow backend.

No loss decrease after 5 epochs.

Saving model.
+--------------------------------------------------------------------------+
|        Model ID        |          Loss          |      Metric Value      |
+--------------------------------------------------------------------------+
|           0            |   4.816269397735596    |         0.5852         |
+--------------------------------------------------------------------------+

+----------------------------------------------+
|               Training model 1               |
+----------------------------------------------+
Using TensorFlow backend.
Epoch-14, Current Metric - 0.83:  28%|██████▊                 | 110/387 [01:02<02:46,  1.67 batch/s]Time is out.
[INFO] training model for 86400 seconds max...  
Preprocessing the images.
Preprocessing finished.

Initializing search.
Initialization finished.

+----------------------------------------------+
|               Training model 0               |
+----------------------------------------------+
Using TensorFlow backend.

No loss decrease after 5 epochs.
...
+----------------------------------------------+
|              Training model 21               |
+----------------------------------------------+
Using TensorFlow backend.

No loss decrease after 5 epochs.

+--------------------------------------------------------------------------+
|    Father Model ID     |                 Added Operation                 |
+--------------------------------------------------------------------------+
|                        |             to_deeper_model 16 ReLU             |
|           16           |               to_wider_model 16 64              |
+--------------------------------------------------------------------------+

Saving model.
+--------------------------------------------------------------------------+
|        Model ID        |          Loss          |      Metric Value      |
+--------------------------------------------------------------------------+
|           21           |   0.8843476831912994   |   0.9316000000000001   |
+--------------------------------------------------------------------------+
+----------------------------------------------+
|              Training model 22               |
+----------------------------------------------+
Using TensorFlow backend.
Epoch-3, Current Metric - 0.9:  80%|████████████████████▊     | 310/387 [03:50<00:58,  1.31 batch/s]Time is out.

No loss decrease after 30 epochs.

在这里你可以看到我们的脚本正在指示Auto-Keras执行六组实验。

在NVIDIA K80 GPU上,总训练时间为3天多一点

Auto-Keras的结果:

Auto-Keras与AutoML:入门指南

使用Auto-Keras通常是一个非常耗时的过程。使用Auto-Keras进行训练可在8-12小时范围内为CIFAR-10生成最佳型号。

在上图中,你可以看到训练时间(x轴)对使用Auto-Keras的总体准确度(y轴)的影响。较短的训练时间,即1小时和2小时,大约可以达到73%的准确性。一旦我们训练4小时,我们就能达到高达93%的准确率。训练8-12小时,我们就能获得95%的精确度了。超过8-12小时的训练不会提高我们的准确度,这意味着我们已达到饱和点并且Auto-Keras无法进一步优化。

Auto-Keras和AutoML值得吗?

Auto-Keras与AutoML:入门指南

Auto-Keras值得吗?这无疑是行业向前迈出的一大步,对那些没有深入学习领域知识的人尤其有用。

在无监督学习之外(从未标记数据自动学习模式),非专家的自动机器学习被认为是机器学习的“圣杯”。Google的AutoML和开源Auto-Keras软件包都试图将机器学习带给大众,即使是没有关键性技术的经验的程序员。

虽然Auto-Keras在CIFAR-10上工作得相当好,但是使用我之前关于深度学习,医学图像和疟疾检测的文章进行了第二组实验使用简化的ResNet架构获得了97.1%的准确率,该架构花费了不到一小时的时间进行训练。然后我让Auto-Keras在相同的数据集上运行24小时-结果只有96%的准确度,低于我自己定义的架构。

但不管怎样,谷歌的AutoML和Auto-Keras都是向前迈出的一大步。



本文作者:【方向】

阅读原文

本文为云栖社区原创内容,未经允许不得转载。

相关推荐