发现为您的数据量身定制的增强策略
deepaugment的Python项目详细描述
深度增强
deepaugment发现了为您的图像定制的增强策略。采用贝叶斯优化方法对数据增广超参数进行优化。工具:
- 降低CNN模型的错误率(与未增强相比,WRN-28-10上的CIFAR-10的错误率降低了60%)
- 通过自动化过程节省时间
资源:幻灯片
安装/使用
教程:谷歌酷睿
$ 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解决了这两个问题。它的主要设计目标是:
- 在保持结果质量的同时最小化优化的计算复杂性
- 模块化和用户友好
与自动增强相比,第一个目标是通过以下更改实现的:
- 贝叶斯优化代替强化学习
- 它需要更少的迭代次数(大约100次)
- 最小化子模型
- 降低每次训练的计算复杂度(~20次)
- 少随机增广搜索空间设计
- 减少迭代次数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的工作周期可概括为:
- 建立目标函数的代理模型
- 查找参数在代理项上表现最好的(或选择随机超参数)
- 使用这些参数执行目标函数
- 用这些参数和目标函数的结果(值)更新代理模型
- 重复步骤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图像的可训练参数。下面是子模型的示意图:
儿童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.0到1.0.0的版本被视为α相且不遵循此策略。
数据管道
类图
创建人:pyreverse
包装图
创建人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