原文地址: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,这是Google的AutoML的一个开源替代方案,用于自动机器学习和深度学习。
在对数据集训练神经网络时,有两个主要目标是专业的深度学习人员要努力优化和平衡的:
依赖于数据集和问题,需要一个深度学习专家实验几十上百次,在神经网络结构和超参数之间找到均衡。
这些实验总计要耗费成百上千小时的GPU计算时间。
这还是对于专家而言 - 那么,非深度学习专家呢?
正式说Auto-Keras和AutoML吧:
Auto-Keras和AutoML的最终目标都是通过使用自动神经架构搜索(NAS)算法来减少进入机器学习和深度学习的障碍。
Auto-Keras和AutoML使得非深度学习专家能以最少的深度学习的领域知识和实际数据来训练他们自己的模型。
使用Auto-Keras和AutoML,一个只有很少机器学习专业知识的程序员就能应用这些算法以很少的努力就能取得最先进的性能。
听起来好的有点假哈?
可能吧。但是,你应该先读一下剩下的内容再想原因。
要了解有关AutoML的更多信息(以及如何使用Auto-Keras 自动训练和调整神经网络),请继续看吧!
在本博客的第一部分,我们将介绍自动机器学习(AutoML)和神经架构搜索(NAS),这个算法使得AutoML应用到神经网络和深度学习成功可能。
我们也会简单说说Google的AutoML,一个允许只具有有限的机器学习专业知识的程序猿能在他们自己的数据集上训练高准确度的模型的一套工具库。
当然,Google的AutoML是专利算法(有一丢丢贵)。
能替代AutoML的是开源的Auto-Keras,构建于Keras和PyTorch上。
随后,我将向你展示如何用Auto-Keras自动训练一个网络,此外还要评估它。
什么是自动机器学习(AutoML)?
图1: Auto-Keras是Google AutoML的替代品。这些软件项目可以帮助您自动训练模型,仅需很少的干预。对于深度学习新人或者稍后要搜索到的基线模型来说,它们是个很棒的选择。在非监督学习(从未标注数据自动学习的模式)之外,自动机器学习简直是非专业人员的机器学习“圣杯”。
想象下能以如下方式自动创建机器学习模型:
有一些公司在尝试创建这样一个解决方案 - 搞大了的一个是Google的AutoML。
Google的AutoML使得只有很少的机器学习经验的开发人员和工程师能对他们的数据集自动训练神经网络。
Google的AutoML的算法底层是迭代:
程序猿或工程师使用AutoML不需要定义他们自己的神经网络架构或者调整超参数 - AutoML会自动干这些的。
神经架构搜索(NAS)使得AutoML成为可能:
图2:神经架构搜索(NAS)在搜索CIFAR-10的最佳CNN架构时生成了一个模型,这些是概览图(来源:Zoph等人的图4 )Google的AutoML和Auto-Keras都以这个称为神经架构搜索(NAS)的算法为驱动。
给定你的输入数据集,神经架构搜索算法会自动最优的结构和对应的参数。
神经架构搜索本质上替代了拥有一组算法的深度学习攻城狮/专业人员来自动调整模型!
在计算机视觉和图像识别方面,神经架构搜索算法可以:
如果使用AutoML系统的是有经验的深度学习专业人员,那么,他们可以决定:
这种方法是介于全自动机器学习解决方案与需要深度学习专家的解决方案之间的混合体 - 通常这种方法会比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的开源替代方案
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
正如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行:
在我们的脚本第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中的每一个时间值,其中:
对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值得吗?
在非监督学习(从未标注数据自动学习的模式)之外,自动机器学习简直是非专业人员的机器学习“圣杯”。(译注:原文就有这一段重复的,我有什么办法,头皮发麻)
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的主干,可以自动的:
主要好处包括:
当然,这是要付费的 - 而且是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在自动机器学习和深度学习方面可能是在正确的方向上迈了一步,但在这方面仍然还有大量的工作要做。
没有现成的算法能解决机器学习/深度学习的问题。相反,我建议你投资你自己成为一个深度学习的实践者和工程师。
你现在学到的技能,在将来都会有巨大的收获。
希望你喜欢今天的教程。