乐趣区

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 是 Google AutoML 的替代品。它可以帮助你自动训练模型,几乎不需要干预。对于新手深度学习从业者来说,它们是很好的选择。
在无监督学习之外,非专家的自动机器学习被认为是机器学习的“圣杯”。
想象一下通过以下方式自动创建机器学习模型的能力:
1. 安装库 / 使用 Web 界面;
2. 将库 / 接口指向你的数据;
3. 自动训练数据模型而无需调整参数 / 需要深入了解为其提供动力的算法;
一些公司正试图创建这样的解决方案, 其中一个就是谷歌的 AutoML。Google AutoML 使非常有限的机器学习经验的开发人员和工程师能够自动在他们自己的数据集上训练神经网络。
谷歌的底层 AutoML 算法是迭代的:
1. 在训练集上训练网络;
2. 在测试集上评估网络;
3. 修改神经网络架构;
4. 调整超参数;
5. 重复上述过程;
使用 AutoML 的程序员或工程师不需要定义他们自己的神经网络架构或调整超参数,AutoML 会自动为他们做这件事。
神经架构搜索(NAS)使 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 包是由在德克萨斯州 A &M 大学数据实验室团队开发。Auto-Keras 是 Google AutoML 的开源替代品。
Auto-Keras 依然是利用神经架构搜索,但应用“网络态射”(在更改架构时保持网络功能)以及贝叶斯优化,以指导网络态射以实现更高效的神经网络搜索。你可以在 Jin 等人的 2018 年出版物 Auto-Keras:Efficient Neural Architecture Search with Network Morphism 中找到 Auto-Keras 框架的全部细节。
安装 Auto-Keras:

正如 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 通常是一个非常耗时的过程。使用 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 值得吗?这无疑是行业向前迈出的一大步,对那些没有深入学习领域知识的人尤其有用。
在无监督学习之外(从未标记数据自动学习模式),非专家的自动机器学习被认为是机器学习的“圣杯”。Google 的 AutoML 和开源 Auto-Keras 软件包都试图将机器学习带给大众,即使是没有关键性技术的经验的程序员。
虽然 Auto-Keras 在 CIFAR-10 上工作得相当好,但是我使用我之前关于深度学习,医学图像和疟疾检测的文章进行了第二组实验。我使用简化的 ResNet 架构获得了 97.1%的准确率,该架构花费了不到一小时的时间进行训练。然后我让 Auto-Keras 在相同的数据集上运行 24 小时 - 结果只有 96%的准确度,低于我自己定义的架构。
但不管怎样,谷歌的 AutoML 和 Auto-Keras 都是向前迈出的一大步。

本文作者:【方向】阅读原文
本文为云栖社区原创内容,未经允许不得转载。

退出移动版