发现为您的数据量身定制的增强策略

deepaugment的Python项目详细描述


深度增强

pypilicense:mitcode style:black

deepaugment发现了为您的图像定制的增强策略。采用贝叶斯优化方法对数据增广超参数进行优化。工具:

  1. 降低CNN模型的错误率(与未增强相比,WRN-28-10上的CIFAR-10的错误率降低了60%)
  2. 通过自动化过程节省时间

资源:幻灯片

安装/使用

教程:谷歌酷睿

$ pip install deepaugment

简单使用(任何数据集)

fromdeepaugment.deepaugmentimportDeepAugmentdeepaug=DeepAugment(my_images,my_labels)best_policies=deepaug.optimize(300)

简单使用(在Keras上使用CIFAR-10)

deepaug=DeepAugment("cifar10")best_policies=deepaug.optimize(300)

高级用法

fromkeras.datasetsimportfashion_mnist# my configurationmy_config={"model":"basiccnn","method":"bayesian_optimization","train_set_size":2000,"opt_samples":3,"opt_last_n_epochs":3,"opt_initial_points":10,"child_epochs":50,"child_first_train_epochs":0,"child_batch_size":64}(x_train,y_train),(x_test,y_test)=fashion_mnist.load_data()# X_train.shape -> (N, M, M, 3)# y_train.shape -> (N)deepaug=DeepAugment(iamges=x_train,labels=y_train,config=my_config)best_policies=deepaug.optimize(300)

结果

在WRN-28-10上测试的CIFAR-10最佳策略

  • 方法:wide-resnet-28-10通过最佳发现策略使用cifar-10增强图像进行训练,并使用未经整合的图像(其他都一样)。
  • 结果:deepaugment使误差降低了60%(精度提高了8.5%)。

设计目标

deepaugment是一个可扩展的模块化合作伙伴,可用于自动增强(cubuk等人,2018年)。Autoaugment是2018年最令人兴奋的出版物之一。这是第一个使用强化学习来解决这个问题的方法。然而,autoaugmentation没有完整的开源实现(控制器模块不可用)来阻止用户为自己的数据集运行它,并且需要15000次迭代来学习(根据论文)增强策略,这需要大量的计算资源。因此,即使源代码完全可用,大多数人也无法从中受益。

deepaugment解决了这两个问题。它的主要设计目标是:

  1. 在保持结果质量的同时最小化优化的计算复杂性
  2. 模块化和用户友好

与自动增强相比,第一个目标是通过以下更改实现的:

  1. 贝叶斯优化代替强化学习
    • 它需要更少的迭代次数(大约100次)
  2. 最小化子模型
    • 降低每次训练的计算复杂度(~20次)
  3. 少随机增广搜索空间设计
    • 减少迭代次数De

为了实现第二个目标,用户界面的设计为用户提供了广泛的配置可能性和模型选择(例如,选择子模型或输入自行设计的子模型)。

重要性

实际重要性

deepaugment使得数据扩充的优化具有可扩展性,使用户可以在不需要大量计算资源的情况下优化扩充策略。 作为计算成本的估算,使用aws p3.x2large实例,在cifar-10数据集上花费4.2小时(500次迭代),成本约为$13

学术重要性

据我们所知,deepaugment是第一种利用贝叶斯优化方法解决数据增广超参数优化问题的方法。

工作原理

deepaugment的三个主要组件是控制器、增广器和子模型。总体工作流程是控制器对新的增广策略进行采样,增广器根据新的增广策略对图像进行变换,子模型由增广图像从头开始训练。然后,根据子模型的训练历史计算奖励。这个奖励被返回给控制器,它用这个奖励和相关的扩充策略更新它的代理模型。然后,控制器再次采样新策略,重复相同的步骤。此过程循环,直到用户确定达到最大迭代次数。

控制器可以设置为使用贝叶斯优化(默认)或随机搜索。如果设置为贝叶斯优化,则通过随机森林估计器和预期改进获取函数对新策略进行采样。

简化工作流

为什么选择贝叶斯优化?

在超参数优化中,主要选择随机搜索、网格搜索、贝叶斯优化(bo)和强化学习(rl)(按方法复杂度排序)。谷歌的"自动增强"使用rl进行数据增强超参数调整,但它需要15000次迭代来学习策略(这意味着训练子cnn模型15000次)。因此,它需要大量的计算资源。另一方面,贝叶斯优化在100-300次迭代中学习好的策略,使其速度提高了40倍。此外,在超参数优化方面,它比网格搜索和随机搜索在精度、成本和计算时间上都要好(我们可以将增广策略的优化看作是一个超参数优化问题,其中超参数涉及到h扩充而不是深度学习架构)。这个结果并不奇怪,因为尽管进行了网格搜索或随机搜索,bo还是会选择新的超参数,这与以前的结果一样,都是针对尝试过的超参数的。

优化比较

贝叶斯优化是如何工作的?

贝叶斯优化(bo)的目标是找到使目标函数值最大化的参数集。建立了未探明参数目标函数预测值的替代模型。bo的工作周期可概括为:

  1. 建立目标函数的代理模型
  2. 查找参数在代理项上表现最好的(或选择随机超参数)
  3. 使用这些参数执行目标函数
  4. 用这些参数和目标函数的结果(值)更新代理模型
  5. 重复步骤2-4,直到达到最大迭代次数

有关更详细的解释,请阅读本博客文章以高级方式解释BO,或浏览本审查文件

增强策略

策略描述将在数据集上应用扩展。每个策略包含两种扩充类型的变量,它们的大小和要扩充的数据部分。示例策略如下:

示例策略

目前,每个aug.type变量可以采用20种增强技术(见右上图)。所有技术都是(此列表可能会在以后的版本中增长):

AUG_TYPES=["crop","gaussian-blur","rotate","shear","translate-x","translate-y","sharpen","emboss","additive-gaussian-noise","dropout","coarse-dropout","gamma-contrast","brighten","invert","fog","clouds","add-to-hue-and-saturation","coarse-salt-pepper","horizontal-flip","vertical-flip"]

子模型

源代码

在优化过程中,从无到有地反复训练子模型。它的训练次数取决于用户选择的迭代次数,为了获得良好的效果,迭代次数预计在100-300次左右。子模型是算法的计算瓶颈。在当前的设计中,使用v100 gpu(112个tensorflops)在aws实例p3.x2large上对32x32个图像的训练时间约为30秒。它有1250858个32x32图像的可训练参数。下面是子模型的示意图: child cnn

儿童CNN型号的其他选择

标准子模型是一个基本的cnn,上面给出了它的图表和细节。但是,您不受该模型的限制。您可以使用自己的keras模型,方法是将其作为:

my_config={"model":my_keras_model_object}deepaug=DeepAugment(my_images,my_labels,my_config)

或者使用一个已实现的小模型,如wideresnet-40-2(虽然它比基本cnn大):

my_config={"model":"wrn_40_2"}# depth(40) and wideness-factor(2) can be changed. e.g. wrn_20_4

或者使用大模型(除非您有大量计算资源,否则不推荐):

my_config={"model":"InceptionV3"}
my_config={"model":"MobileNetV2"}

奖励功能

源代码

奖励函数以子模型的k个最高验证精度的平均值计算,其不小于相应训练精度的0.05。k可以由用户通过更新配置中的key作为deepaugment()类的参数来确定(k默认为3)。

配置选项

deepaugment可以在初始化期间被赋予一个配置字典。它应该具有以下键:

  • 模型:子模型类型。选项:"basiccnn"、"inceptionv3"、"mobilenetv2"、"wrn-models.model object"
  • 方法:"贝叶斯优化"或"随机"(用于随机搜索)
  • 训练集大小:优化过程中训练集的大小。它应该足够小,计算时间不会太长。
  • <>>opt_samples:
    将为每个增强策略运行样本数优化器。子模型的训练是随机的,验证精度的结果可能与每次运行略有不同。该工具默认情况下训练子模型三次并取平均值,以便获得更可靠的精度结果。
  • opt_last_n_epoch:其验证精度平均值将用作奖励的非过度拟合的epoch数。对于每一次培训,opt_last_n_epochs最高验证精度(其与培训精度的差异不超过10%)被取平均值并作为奖励。
  • 选择初始点:贝叶斯优化器将尝试随机初始策略的数量。它将是skopt优化器的n_initial\u points参数(请参阅其文档
  • 子代:子模型的代数
  • 儿童优先训练阶段:如果不是0,则儿童模型在没有任何增强的情况下进行预训练,其结果权重在每次有增强的训练中加载。其目的是对子模型10-20个阶段进行一次培训,从而为优化器迭代的每次培训节省10-20个阶段,每次培训次数为+100次。
  • 子批大小:子模型的批大小
  • 每个月的权重路径:预增强训练权重的路径。如果儿童优先列车段=0,则不需要
  • 日志记录:获取优化消息的日志记录对象。
  • 笔记本路径:记录所有迭代中所有培训的路径。对于每次迭代,记录培训历史、试验编号、样本编号、计算的奖励和最近的平均验证准确度。每次试验时都会更新记录,以确保在优化无意中断时不会丢失记录。记录可在"/reports/experiments/<;experiment-name-as-year-month-day-hour-minute">;/notebook.csv"

默认配置如下:

$ pip install deepaugment
0

版本控制规则

使用三位数系统,如1.2.3。版本的每个增量都是以下类型之一:

  • 次要:如果错误被修复,或者文档发生了重大变化。1.2.3->;1.2.4
  • 主要:如果一个特性实现不同,或者添加了一个新特性。1.2.3->;1.3.0
  • 破坏性:如果删除或重命名某个功能。1.2.3->;2.0.0(不保证向后兼容)

注:从0.0.01.0.0的版本被视为α相且不遵循此策略。

数据管道

data-pipeline-2data-pipeline-1

类图

创建人:pyreverse Classes_deepaugment

包装图

创建人rg/blogentry/6883" rel="nofollow">pyreverse包装图

参考文献

[1]Cubuk等人,2018年。自增强:从数据中学习增强策略 (arxiv

[2]Zoph等人,2016年。强化学习的神经结构搜索 (arxiv

[3]Shahriari等人,2016年。贝叶斯优化综述 (ieee

[4]Dewancker等人贝叶斯优化初级教程(白皮书

[5]Devries,泰勒,2017年。带截断的cnn的改进正则化 (arxiv

博客:

  • 贝叶斯优化的概念解释(towardsdatascience
  • 比较实验:贝叶斯选择。vs网格搜索vs随机搜索(mlconf

库:


联系人

Baris Ozmen,hbaristr@gmail.com

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java我能在这个程序中更好地使用内存吗?   为什么我的Java while循环迭代了一半   java IntelliJ IDEA不在构建时复制资源   socket仅在Java TCP服务器输出上检查客户端断开连接   java游戏物理摩擦   java片段onClick调用方法   symja数学分析器中无法识别java Abs[x]   java在使用泛型时创建二进制搜索树类的实例?   java在外键约束表上的添加和删除   语法java表达式的含义,如果有条件   java创建内联对象并作为参数传递   是否有相当于Redis排序集(zset)的Java数据结构   java找不到适合的方法(无参数)   音频文件操作给定字节帧的音量Java   Eclipse4不以JavaWebStart启动   java如何使用org在JSON对象中获取嵌套的键元素。json?   java与Jackson的反序列化:“org.codehaus.Jackson.map.JsonMappingException:无法反序列化[projectname]的实例。”   字符串的Java正则表达式   spring集成上的java检测缺火指令