Auto-Keras与AutoML: 入门指南

原文地址:https://www.pyimagesearch.com/2019/01/07/auto-keras-and-automl-a-getting-started-guide/

源代码可以在原文的最开始和结束的位置找到下载,作者会让email注册,确认,然后发一波源码和广告。

另外,Linux下如何我不知道,但是在window10上安装Auto-Keras需要安装PyTorch 0.4.0,我本机是1.0的PyTorch,没有安装成功,也没打算试了。毕竟安装个pytorch下载量也不小,而且我也没耐心持续运行几天来得到同样的结论~ 电费不要钱的啊,亲~ 

==========================格叽格叽 格叽格叽 格叽 格叽====================================

Auto-Keras与AutoML:入门指南

 在本教程中,你将学到如何使用Auto-Keras,这是Google的AutoML的一个开源替代方案,用于自动机器学习和深度学习。

在对数据集训练神经网络时,有两个主要目标是专业的深度学习人员要努力优化和平衡的:

  1. 定义神经网络结构以符合数据集的本质
  2. 通过大量实验来调整超参数来增加模型的准确度,并且能泛化于训练集合测试集以外的数据。典型的需要调整的超参数包括优化算法(SGD,Adam等),学习率和学习率调度,以及正则化等等

依赖于数据集和问题,需要一个深度学习专家实验几十上百次,在神经网络结构和超参数之间找到均衡。

这些实验总计要耗费成百上千小时的GPU计算时间。

这还是对于专家而言 - 那么,非深度学习专家呢?

正式说Auto-Keras和AutoML吧:

Auto-Keras和AutoML的最终目标都是通过使用自动神经架构搜索(NAS)算法来减少进入机器学习和深度学习的障碍。

Auto-Keras和AutoML使得非深度学习专家能以最少的深度学习的领域知识和实际数据来训练他们自己的模型。

使用Auto-Keras和AutoML,一个只有很少机器学习专业知识的程序员就能应用这些算法以很少的努力就能取得最先进的性能。

听起来好的有点假哈?

可能吧。但是,你应该先读一下剩下的内容再想原因。

要了解有关AutoML的更多信息(以及如何使用Auto-Keras 自动训练和调整神经网络),请继续看吧!

Auto-Keras和AutoML:入门指南

在本博客的第一部分,我们将介绍自动机器学习(AutoML)和神经架构搜索(NAS),这个算法使得AutoML应用到神经网络和深度学习成功可能。

我们也会简单说说Google的AutoML,一个允许只具有有限的机器学习专业知识的程序猿能在他们自己的数据集上训练高准确度的模型的一套工具库。

当然,Google的AutoML是专利算法(有一丢丢贵)。

能替代AutoML的是开源的Auto-Keras,构建于Keras和PyTorch上。

随后,我将向你展示如何用Auto-Keras自动训练一个网络,此外还要评估它。

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

图1: Auto-Keras是Google  AutoML的替代品。这些软件项目可以帮助您自动训练模型,仅需很少的干预。对于深度学习新人或者稍后要搜索到的基线模型来说,它们是个很棒的选择。

在非监督学习(从未标注数据自动学习的模式)之外,自动机器学习简直是非专业人员的机器学习“圣杯”。

想象下能以如下方式自动创建机器学习模型:

  1. 安装库/使用web接口
  2. 指向库或接口到你的数据
  3. 对数据自动训练模型,无需调整参数,也不需要深入理解提供动力的算法

有一些公司在尝试创建这样一个解决方案 - 搞大了的一个是Google的AutoML。

Google的AutoML使得只有很少的机器学习经验的开发人员和工程师能对他们的数据集自动训练神经网络。

Google的AutoML的算法底层是迭代:

  1. 在训练集上训练网络
  2. 在测试集上评估网络
  3. 修改神经网络结构
  4. 调整超参数
  5. 重复上述过程

程序猿或工程师使用AutoML不需要定义他们自己的神经网络架构或者调整超参数 - AutoML会自动干这些的。

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

图2:神经架构搜索(NAS)在搜索CIFAR-10的最佳CNN架构时生成了一个模型,这些是概览图(来源:Zoph等人的图4 )

Google的AutoML和Auto-Keras都以这个称为神经架构搜索(NAS)的算法为驱动。

给定你的输入数据集,神经架构搜索算法会自动最优的结构和对应的参数。

神经架构搜索本质上替代了拥有一组算法的深度学习攻城狮/专业人员来自动调整模型!

在计算机视觉和图像识别方面,神经架构搜索算法可以:

  1. 接受输入训练数据集
  2. 优化和查找被称为cell的架构块 - 这些cells是被自动学习到的,看起来类似inception,residual或者squeeze/fire微架构。
  3. 持续训练和查找"NAS算法搜索空间"里的更优的cells.

如果使用AutoML系统的是有经验的深度学习专业人员,那么,他们可以决定:

  1. 在训练数据集的一个小得多的子集上运行NAS
  2. 查找和优化结构块/cell集合
  3. 在搜索过程中,使用这些cell来手动定义更深版本的网络查找
  4. 在全数据集上用他们的专业知识和最佳实践来训练网络

这种方法是介于全自动机器学习解决方案与需要深度学习专家的解决方案之间的混合体 - 通常这种方法会比NAS自己发现的网络模型更准确。

我推荐阅读《Neural Architecture Search with Reinforcement Learning 》(Zoph and Le,2016)和《Learning Transferable Architectures for Scalable Image Recognition》 (Zoph et al., 2017)获取更多关于关于这些算法的内容。

Auto-Keras:Google AutoML的开源替代方案

图3:  Auto-Keras包是由 德州农工大学DATA实验室团队开发,是 Google AutoML的开源替代品。

Auto-Keras软件包是德州农工大学DATA实验室团队开发的Google AutoML的替代品。

Auto-Keras也利用了神经架构搜索,但应用的是"网络态射"(保持网络功能而改变网络结构)以及贝叶斯优化。用来引导网络态射实现更有效的神经网络搜索。

你可以在Jin等人2018年的出版物《Auto-Keras:Efficient Neural Architecture Search with Network Morphism》中找到Auto-Keras框架的所有细节。

项目结构

继续,从今天博客文章的“下载”部分获取zip文件 。

然后解压文件,从你的终端进入该目录。

用tree命令来看看今天的项目:

$ tree --dirsfirst
.
├── output
│   ├── 14400.txt
│   ├── 28800.txt
│   ├── 3600.txt
│   ├── 43200.txt
│   ├── 7200.txt
│   └── 86400.txt
└── train_auto_keras.py

1 directory, 7 files

今天我们要回顾一个Python脚本: train_auto_keras.py。

因为会有大量的打印输出到屏幕,我选择了保留我们的分类报告(scikit-learn的classification工具帮助生成)作为文本文件存到磁盘。检查上面的output目录,你会看到有几个报告已经生成了。继续,打印一个到你的终端(cat output/14400.txt),看看它长啥样。

安装 Auto-Keras

图4:Auto-Keras软件包依赖于Python 3.6,TensorFlow和Keras

 

正如Auto-Keras GitHub存储库所述,Auto-Keras当前是“pre-release”的状态 — 这个并不是官方发布。

接着,Auto-Keras需要Python 3.6,且当前仅兼容Python 3.6.

如果你使用任何其他版本的python,而不是3.6,你将不能使用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官方的GitHub问题页上发布,作者会帮你的。(译注:至少Windows安装的时候,需要Torch 0.4,我的Torch 1.0的环境报错了)

用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里,非常方便。
  • 接下来是我们最重要的导入,autokeras,导入为ak的缩写。
  • os模块是必需的,因为在构建输出文件路径时,我们要适应在各种操作系统上的路径分隔符。

在我们的脚本第7行定义了main函数。由于Auto-Keras和TensorFlow处理线程的方式,我们需要将代码包装在main函数中。详见GitHub issue thread

OUTPUT_PATH定义在第9行

现在,我们来为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
	]

第13-20行定义了一组TRAINING_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"]

第25行,我们的cifar数据已经加载并被保存到一个训练测试集的分割中。

接下来,我们将缩放数据到[0,1]区间(第26和27行

我们的类名labelNames初始化在第30和31行。CIFAR-10中有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中的每一个时间值,其中:

  • 初始化model(用ak.ImageClassifier),开始训练(第39和40行)。注意,我们没有实例化出一个特定的CNN类的对象,不像之前的教程,比如这个。我们也不需要像通常那样调整超参数。Auto-Keras会为我们做所有这些,并提供一份搜寻报告。
  • 一旦到达时间限制,就采用Auto-Keras搜寻到的最佳model和参数重新训练模型(第41行
  • 评估和构建分类report(第44-47行)。
  • 将分类report和准确度score一起写入磁盘,以便我们评估更长训练时间的影响(第50-54行)。

对TRAINING_TIMES中的每一个时间值重复以上过程。

最后,我们会检查并启动main线程执行:

# 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()

这里我们检查确保这是执行的 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结果:

在上面的图5中,你可以看到使用Auto-Keras的训练时间(x轴)对总体准确度(y轴)的影响。

较短的训练时间,即1小时和2小时,导致约73%的准确性。一旦我们训练4小时,就可以达到93%以上的准确率。

我们获得的最好的准确度是在8-12范围内,准确度95%。

超过8-12小时的训练没有提高我们的准确度,暗示着我们已达到饱和点,Auto-Keras无法再进一步优化。

Auto-Keras和AutoML值得吗?

图6: Auto-Keras(或AutoML)值得吗?这无疑是行业向前迈出的一大步,对那些没有深入学习领域知识的人尤其有用。换句话说,经验丰富的深度学习专家可以精巧的构建架构+在极短的时间内训练它们+达到相同或更高的准确度。

在非监督学习(从未标注数据自动学习的模式)之外,自动机器学习简直是非专业人员的机器学习“圣杯”。(译注:原文就有这一段重复的,我有什么办法,头皮发麻)

Google的AutoML和开源Auto-Keras软件包都试图将机器学习带给大众,即使没有重要的技术经验。

尽管Auto-Keras在CIFAR-10上表现不错,我还是进行了第二组实验,使用我之前发布过的《deep learning, medical imagery, and malaria detection》。

上一篇文章中,我使用简化的ResNet架构获得了97.1%的准确率,只花了不到一小时进行训练。

然后我让Auto-Keras在相同的数据集上运行24小时 - 结果只有96%的准确率,低于我手工定义的架构。

Google的AutoML和Auto-Keras都迈出了重要一步; 然而,自动化机器学习还差的远。

自动机器学习(目前)并没有超越深度学习的专业知识 - 领域专业知识,特别是你正在使用的数据,对于获得更高精度的模型绝对至关重要。

我的建议是投资自己的知识不要依赖自动算法

要成为一名成功的深度学习实践者和工程师,你需要将正确的工具带到工作中。使用AutoML和Auto-Keras是因为它们是什么,是工具,然后继续用其他知识填充你自己的工具箱。

总结

在今天的博客文章中,我们讨论了Auto-Keras和AutoML,这是一套用于执行自动机器学习和深度学习的工具和库。

Auto-Keras和AutoML的最终目标是通过使用神经架构搜索(NAS)算法来减少进入机器学习和深度学习的障碍。

NAS算法,Auto-Keras和AutoML的主干,可以自动的

  • 定义和优化神经网络架构
  • 调整超参数到模型

主要好处包括

  • 能够用很少的专业知识进行机器学习和深度学习
  • 获得高精度模型,可以泛化到训练和测试集之外的数据
  • 使用GUI界面或简单的API快速启动和运行
  • 只需很少的努力就可以获得最先进的性能

当然,这是要付费的 - 而且是2个价格

首先,Google AutoML贵的一P,将近每小时20刀。

为了节约小钱钱,你大概会选择Auto-Keras,这个开源的替代品。但是你仍然需要支付GPU的计算时长的费用。

用NAS算法替换掉一个实际的深度学习专家将需要很多个小时的计算来搜索优化参数。

尽管我们在CIFAR-10上达到一个较高的准确度(大约96%),但是当我应用Auto-Keras到我之前一篇文章《medical deep learning and malaria prediction》时,Auto-Keras只取得了96.1%的准确度,比我的97%低了整整一个百分点(而Auto-Keras却需要2300%的计算时间)。

虽然Auto-Keras和AutoML在自动机器学习和深度学习方面可能是在正确的方向上迈了一步,但在这方面仍然还有大量的工作要做。

没有现成的算法能解决机器学习/深度学习的问题。相反,我建议你投资你自己成为一个深度学习的实践者和工程师。

你现在学到的技能,在将来都会有巨大的收获。

希望你喜欢今天的教程。

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值