前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >14种模型设计帮你改进你的卷积神经网络(CNN)

14种模型设计帮你改进你的卷积神经网络(CNN)

作者头像
两只橙
发布2018-04-27 17:21:45
1.5K0
发布2018-04-27 17:21:45
举报
文章被收录于专栏:深度学习深度学习

自2011年以来,深度卷积神经网络(CNN)在图像分类的工作中的表现就明显优于人类,它们已经成为在计算机视觉领域的一种标准,如图像分割,对象检测,场景标记,跟踪,文本检测等。

但,想要熟练掌握训练神经网络的能力并不是那么容易。与先前的机器学习思维一样,细节决定成败。但是,训练神经网络有更多的细节需要处理。你的数据和硬件有什么限制?你应该是从何种网络开始?你应该建立多少与卷积层相对的密集层?你的激励函数怎样去设置?即使你使用了最流行的激活函数,你也必须要用常规激活函数。

学习速率是调整神经网络训练最重要的超参数,也是最难优化的参数之一。太小,你可能永远不会得到一个解决方案;太大,你可能刚好错过最优解。如果用自适应的学习速率的方法,这就意味着你要花很多钱在硬件资源上,以此来满足对计算的需求。

设计选择和超参数的设置极大地影响了CNN的训练和性能,但对于深度学习领域新进入者来说,设计架构直觉的培养可能就需要资源的稀缺性和分散性。

《神经网络:权衡技巧》是一本主要着重于实际调优的书,出版于2003年,并在2012年再版。而深度学习的火爆始于2012年《纽约时报》报道的Geoffrey Hinton 的团队在 Merck Drug Discovery Challenge 上的惊人成功。然而,最近几年最先进的研究成果却消失了。

幸运的是,美国海军研究室的研究员 Leslie Smith发表了关于CNN架构改进和技术提升的系统性研究。下面是他所强调的最重要的一些设计模式

一、14种图像分类的CNN设计模式

根据 Smith 的观点,“这14 种原创设计模式可以帮助没有经验的研究者去尝试将深度学习与新应用结合”。尽管高级的AI研究员可以依靠直觉、经验以及针对性的实验,但这些建议对于那些没有机器学习博士学位的人来说是一个很好的起点。

1) 架构遵循应用

你也许会被 Google Brain 或者 Deep Mind 这些有想象力的实验室所发明的那些耀眼的新模型所吸引,但是其中许多要么是不可能实现的,要么是不实用的对于你的需求。或许你应该使用对你的特定应用最有意义的模型,这种模型或许非常简单,但是仍然很强大,例如 VGG。

2) 路径的激增

每年ImageNet Challenge的赢家都比上一年的冠军使用更加深层的网络。从AlexNet 到Inception到Resnets,Smith和他的团队也观察到“网络的路径数量成倍增长”的趋势,而且,ResNet可以是不同长度的网络的指数集合。

3) 追求简约

更大的并不一定是更好的。在名为“Bigger is not necessarily better”的论文中,Springenberg 等人演示了如何用更少的单元实现最先进的结果。

4)增加对称性

无论是在建筑上,还是在生物上,对称性被认为是质量和工艺的标志。Smith 将 FractalNet 的优雅归功于网络的对称性。

5) 金字塔形状

你总是在表征能力和减少冗余或者无用信息之间权衡。CNNs通常会降低激活函数的采样,并会增加从输入层到最终层之间的连接通道。

6) 过渡训练

另一个权衡是训练准确度和泛化能力。用正则化的方法类似 drop-out 或 drop-path进行提升泛化能力,这是神经网络的重要优势。用比实际用例更难的问题训练你的网络,以提高泛化性能。

7) 覆盖问题的空间

为了扩大你的训练数据和提升泛化能力,要使用噪声和人工增加训练集的大小,例如随机旋转、裁剪和一些图像操作。

8) 递增的功能结构

当架构变得成功时,它们会简化每一层的“工作”。在非常深的神经网络中,每个 层只会递增地修改输入。在ResNets中,每一层的输出可能类似于输入。所以,在 实践中,请在ResNet中使用短的跳过长度。

9) 标准化层的输入

标准化是可以使计算层的工作变得更加容易的一条捷径,并且在实际中可以提升训练的准确性。批量标准化的发明者认为标准化发挥作用的原因在于处理内部的协变量,但Smith 认为,“标准化把所有层的输入样本放在了一个平等的基础上(类似于单位转换),这允许反向传播可以更有效地训练”。

10)输入变换

研究表明,在Wide ResNets中,性能随着通道数量的增加而提升,但是要权衡训练成本与准确性。AlexNet,VGG,Inception和ResNets都是在第一层中进行输入变换,以保证多种方式检查输入数据。

11)可用的资源决定层宽度

可供选择的输出数量并不明显,相应的是,这取决于您的硬件功能和所需的准确性。

12)Summation joining

Summation是一种流行的合并分支的方式。在 ResNets 中,使用求和作为连接机制可以让每一个分支都能计算残差和整体近似。如果输入跳跃连接始终存在,那么Summation会让每一层学到正确地东西(例如:输入的差别)。在任何分支都可以被丢弃的网络(例如 FractalNet)中,你应该使用这种方式保持输出的平滑。

13)下采样变换

在汇聚的时候,利用级联连接来增加输出的数量。当使用大于1的步幅时,这会同时处理加入并增加通道的数量。

14)用于竞争的Maxout

Maxout 用在只需要选择一个激活函数的局部竞争网络中。用的方法包含所有的激活函数,不同之处在于 maxout 只选择一个“胜出者”。Maxout 的一个明显的用例是每个分支具有不同大小的内核,而 Maxout 可以尺度不变。

二、提示&技巧

除了这些设计模式,还有几个技巧和诀窍,以减少架构复杂性和培训时间。

1)使用细调过的预训练网络

机器学习公司 Diffbot 的 CEO Mike Tung 说,“如果你的视觉数据和 ImageNet 相似,那么用预训练网络会帮助你学习得更快”。低水平的CNN通常可以被重复使用,因为它们大多能够检测到像线条和边缘这些常见的模式。用你自己的层替换分类层,并且用你特定的数据去训练最后的几个层。

2)使用 freeze-drop-path

Drop-path 会在迭代训练的过程中随机地删除一些分支。Smith 测试了一种相反的方法,被称为 freeze-path,就是一些路径的权重是固定的、不可训练的,而不是整体删除。该网络可能会获得更高的精度,因为下一个分支比以前的分支包含更多的层,并且修正项更容易得到。

3)使用循环的学习率

学习率的实验会消耗大量的时间,并且会让你遇到错误。自适应学习率在计算上可能是非常昂贵的,但是循环学习率不会。使用循环学习率时,你可以设置一组最大最小边界,并且在这个范围改变它。Smith 在论文中提供了计算学习率的最大值和最小值的方法。

4)在有噪声的标签中使用 bootstrapping

在实践中,很多数据都是混乱的,标签都是主观性的或是缺失的,而且目标有可能是从未遇到过的。Reed 等人在文章中描述了一种给网络预测目标注入一致性的方法。直观地讲,这可以实现,通过网络对环境的已知表示(隐含在参数中)来过滤可能具有不一致的训练标签的输入数据,并在训练时清理该数据。

5)用有 Maxout 的 ELUs,而不是 ReLUs

ELUs是 ReLUs 的一个相对平滑的版本,它能加速收敛并提高准确度。研究调查表明,与 ReLUs 不同,ELUs 拥有负值,这就能允许它们以更低的计算复杂度将平均单位激活推向更加接近0的值,就像批量标准化一样。如果您使用具有全连接层的 Maxout,它们是特别有效的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.01.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档