当前位置: 首页 > 科技观察

性能超越人类炼金术士,AutoGluon低调开源的

时间:2023-03-15 17:24:20 科技观察

自动机器学习能有多好?比如让MobileNet1.0backbone的YOLO3超过ResNet-50backbone的faster-rcnn6个点?AutoGluon的出现表明,人类炼金术士可能会变得越来越不重要。近日,亚马逊正式推出开源代码库AutoGluon。开发人员只需几行代码就可以编写人工智能嵌入式应用程序。一个多月前,AutoGluon在GitHub上悄然上线,但最近几天才正式对外发布。开发者“Justinho”首先试用了AutoGluon,以下是他的心得:《ResNet-50backbone+FasterRCNN如何骑脸输》。不过最终的测试集结果非常出人意料,AutoGluon的NAS搜索结果直接高了。涨六分。对此,李牧表示:知乎用户@Justinho。李牧在知乎上回应:AutoML用了单次训练成本的15倍左右,得到的结果可能比人工调整更好。这个主要针对CV,尤其是检测模型。预计GluonCV中的模型将很快赢得一大波改进。AutoGluon采取了技巧,我们目前只支持GluonCV和GluonNLP中的任务,以及额外的Tabular数据(因为小弟之前有经验)。所以我们可以把以前很有经验的东西放进去,减少搜索参数空间,从而提高速度。当然,AutoGluon还是一个早期的项目,我想还是让团队开发一段时间再公开。有太多有趣的应用、算法、硬件加速可以做。非常欢迎朋友们一起投稿。AutoGluon:AutoGluon中说明的新功能。AutoGluon支持易于使用和可扩展的AutoML,专注于深度学习和实际应用,涵盖图像、文本或表格数据。AutoGluon适用于机器学习新手和专家,使他们能够:用几行代码快速构建数据的深度学习原型;利用自动超参数微调、模型选择/架构搜索和数据处理;无需专业知识自动化深度学习SOTA方法;轻松提升现有的自定义模型和数据管道,或根据用例自定义AutoGluon。支持的特性现在AutoGluon已经支持了以下部分应用:表预测:根据其他列的值预测数据表中某些列的值;图像分类:识别图像中的主要物体;物体检测:检测多个物体;文本分类:根据文本内容进行预测。除了这些,AutoGluon还可以进行神??经架构搜索,使用起来更加方便。如何使用AutoGluon?官方文档中提供了示例代码,摘录机器之心:Samplecodetableprediction对于以表格形式表示的标准数据集(存储为CSV文件等),AutoGluon可以根据其他列的值。值列表。只需调用一次fit(),您就可以在标准的监督学习任务(包括分类和回归)中实现高精度,而无需进行数据清洗、特征工程、超参数优化、模型选择等繁琐的过程。首先,导入AutoGluon中预测表的相关API。importautogluonasagfromautogluonimportTabularPredictionastask加载数据(这里使用官方教程提供的数据集)。train_data=task.Dataset(file_path='https://autogluon.s3.amazonaws.com/datasets/Inc/train.csv')train_data=train_data.head(500)#subsample500datapointsforfasterdemoprint(train_data.head())表中train_data的每一行对应一个单独的训练样本。在官方教程提供的数据集中,每一行对应一个人,表格列包含各种统计特征。我们先用这些特征来预测一个人的收入是否超过$50,000,相关信息记录在表的class栏中。然后训练:dir='agModels-predictClass'#specifiesfolderwheretostoretrainedmodelspredictor=task.fit(train_data=train_data,label=label_column,output_directory=dir)加载测试集并测试:test_data=task.Dataset(file_path='https://autogluon.s3.amazonaws.com/datasets/Inc/test.csv')y_test=test_data[label_column]#valuestoppredicttest_data_nolab=test_data.drop(labels=[label_column],axis=1)#deletelabelcolumntoprovewe'renotcheatingprint(test_data_nolab.head())类似于图像分类和表格预测任务,AutoGluon可以自动对图像进行分类并使用GPU进行训练。首先加载图像分类api:importautogluonasagfromautogluonimportImageClassificationastask然后只需几行代码就可以构建一个图像分类器(数据集是教程自带的数据集):classifier=task.fit(dataset,epochs=10,ngpus_per_trial=1,verbose=False)打印最好的训练结果:print('Top-1valacc:%.3f'%classifier.results['best_reward'])测试单个图像,其中ag.get_gpu_count()用于检测是否有GPU,存在则大于0。#skipthisiftrainingFashionMNISTonCPU.ifag.get_gpu_count()>0:image='data/test/BabyShirt/BabyShirt_323.jpg'ind,prob=classifier.predict(image)print('输入图片被分类为[%s],概率为%.2f.'%(dataset.init().classes[ind.asscalar()],prob.asscalar()))在测试集上测试并打印结果:test_acc=classifier.evaluate(test_dataset)print('Top-1testacc:%.3f'%test_acc)NeuralArchitectureSearch是AutoML框架的一个重要应用。最近,流行的NAS方法如ENAS和ProxylessNAS都通过构建超网和在不同架构之间共享权重来加速搜索。无代理NAS架构。AutoGluon也提供了相应的功能。以“为硬件设备寻找合适的神经网络架构”为例:首先,导入相关的api。importautogluonasagimportmxnetasmximportmxnet.gluon.nnasnn然后使用MXNet框架构建CNN基础设施:,kernel,stride):super().__init__()padding=(kernel-1)//2self.conv=nn.Conv2D(channels,kernel,stride,padding,in_channels=in_channels)self.bn=nn.BatchNorm(in_channels=channels)self.relu=nn.Activation('relu')defhybrid_forward(self,F,x):returnself.relu(self.bn(self.conv(x)))构建用于架构搜索的ENAS单元:fromautogluon.contrib.enasimport*@enas_unit()classResUnit(mx.gluon.HybridBlock):def__init__(self,in_channels,channels,hidden_??channels,kernel,stride):super().__init__()self.conv1=ConvBNReLU(in_channels,hidden_??channels),kernel,stride)self.conv2=ConvBNReLU(hidden_??channels,channels,kernel,1)ifin_channels==channelsandstride==1:self.shortcut=Identity()else:self.shortcut=nn.Conv2D(channels,1,stride,in_channels=in_channels)defhybrid_forward(自我,F,x):returnsself.conv2(self.conv1(x))+self.shortcut(x)使用SequentialBlock创建ENAS网络mynet=ENAS_Sequential(ResUnit(1,8,hidden_??channels=ag.space.Categorical(4,8),kernel=ag.space.Categorical(3,5),stride=2),ResUnit(8,8,hidden_??channels=8,kernel=ag.space.Categorical(3,5),stride=2),ResUnit(8,16,hidden_??channels=8,kernel=ag.space.Categorical(3,5),stride=2),ResUnit(16,16,hidden_??channels=8,kernel=ag.space.Categorical(3,5),stride=1,with_zero=True),ResUnit(16,16,hidden_??channels=8,kernel=ag.space.Categorical(3,5)),stride=1,with_zero=True),nn.GlobalAvgPool2D(),nn.Flatten(),nn.Activation('relu'),nn.Dense(10,in_units=16),)mynet.initialize()#mynet.graph定义奖励函数:reward_fn=*lambda*metric,net:metric*((net.avg_latency/net.latency)**0.1)最后开始训练:scheduler=ENAS_Scheduler(mynet,train_set='mnist',reward_fn=reward_fn,batch_size=128,num_gpus=1,warmup_epochs=0,epochs=1,controller_lr=3e-3,plot_frequency=10,update_arch_frequency=5)scheduler.run()如何使用AutoGluon目前教程很多AutoGluon网站,开发者可以通过我们e它可以快速处理各种结构化和非结构化数据。对于高级开发者,AutoGluon还提供了一系列定制化的指南,我们可以在其中学习如何使用AutoGluon的API来自动提升预测性能。当然,由于AutoGluon还在完善中,有开发者表示,目前的AutoGluon文档主要包括核心流程,还有一些额外的工具没有详细介绍。在知乎评论中,不少开发者表示AutoGluon在视觉任务上效果不错,即使使用AutoGluon自带的YOLOV3(mobilenet1.0backbone),其效果也优于ManuallytunedFasterRCNN(resnet50backbone)。这是很意外的,毕竟YOLOV3是单级检测器,在推理速度上更胜一筹。FasterRCNN的两级检测器,虽然推理速度没有那么快,但是效果总体来说还是比较好的。更不用说AutoGluon使用的主干网络只有MobileNet1.0,其表现力远不如ResNet50。当你将这两个因素结合起来时,AutoGluon优于手动结果是相当令人惊讶的。李牧之前说过,使用AutoGluon的成本几乎是单次训练的15倍,所以在15次尝试中,我们真的未必能找到一套完整的超越AutoGluon的超参数。不过也有开发者认为,如果有更好的搜索空间,15??次随机搜索也能找到更好的超参数。李牧说:“AutoGluon15次搜索的结果和RandomSearch30的结果差不多,但前提是SearchSpace构建得很好,不能太大也不能太小。”目前,已经有很多开发者和研究人员在尝试AutoGluon的结果,一些简单的参数调整工作,机器做得更好,为什么不交给他们呢?算法工程师要做的是理解业务和数据,并做出新的调整和创新。