分类卷积神经网络综合设计指南

原文地址https://hackernoon.com/a-comprehensive-design-guide-for-image-classification-cnns-46091260fb92

前言

当用CNN做图像分类时,我们该从何处入手?该使用哪个预训练网络? 该如何修改它以适应你的需求? 网络应该是20层还是100层? 哪些是最快的? 最准确的? 这些都是在做图像分类任务时确定最佳CNN时所会遇到的问题。

当为图像分类任务选择一个CNN时,主要考虑三个指标:准确性,速度和内存。 这些指标将取决于所选择的CNN模型及你对其进行的修改。 不同的网络如VGG,Inception和ResNets都有自己对这些性能指标。 此外,你可以修改这些模型的网络结构,如去掉一些层,添加一些层,或使用不同的训练技巧。

这篇文章将为你设计CNN提供技术指南。 在CNN的设计上我们将重点关注精度,速度和内存消耗这三个指标。 我们将分析一些典型的CNN分类模型的这些指标,此外我们还将看看对这些基本CNN进行修改将如何影响我们的指标, 最后,您将学习如何为您的特定图像分类任务优化设计CNN!

网络类型

分类卷积神经网络综合设计指南_第1张图片

网络类型和三个指标之间有一个非常明显衡量关系。 首先,你一定要选择Inception或ResNet的设计结构。 它们比VGGNet和AlexNet更新,只是在速度和准确性之间效果更好(如上图所示)。 来自斯坦福的贾斯汀约翰逊为这些CNN中的一些提供了一些很好的对比实验。

现在在Inception和ResNet之间,它们实际上是一种速度与准确性之间的折衷。 想要精确度? 使用超深的ResNet。 想要速度? 使用Inception。

通过更巧妙的卷积操作来减少对内存及运行时间的消耗

最近在传统CNN的设计上提出了一些替代方案,它们可以加速CNN运行时间并减少内存消耗,同时不会有太多精确度损失,而且可以很容易地集成到上述CNN网络类型中:

  • MobileNets使用深度可分离卷积的技术,可以大大减少计算和内存消耗,同时仅牺牲1%到5%的精度,所牺牲的精度具体取决于您希望节省多少计算量。
  • XNOR-Net使用二进制卷积,即只有两个可能的卷积值:0或1。 通过这种设计,使得网络具有高度的稀疏性,因此可以被轻松压缩并所以不会占用太多内存。
  • ShuffleNet使用逐点组卷积和信道混洗来大大降低网络计算成本,同时保持比MobileNets更高的精度。 事实上,他们可以实现早期最先进的CNN分类的准确性,同时速度提高10倍以上。
  • Network Pruning是为了减少运行时间和内存消耗而去除部分CNN的技术,并希望不会降低识别准确性。为了保证识别准确率,被移除的部分应该对最终结果几乎没有影响。 链接部分的文章展示出修剪ResNets的操作非常简单。

网络深度

这个很简单; 增加更多层通常会以速度和内存为代价提高精度。 然而,需要注意的一点是,这种权衡取决于收益递减规律,即我们增加的层数越多,每层给我们的精度上的提升就越加不明显。

分类卷积神经网络综合设计指南_第2张图片分类卷积神经网络综合设计指南_第3张图片

激活函数

最近有很多关于这个问题的争论。 然而,一个很好的经验法则是从ReLU开始。 使用ReLU通常会为您带来一些很好的结果,而不会像ELU,PReLU或LeakyReLU那样需要进行繁琐的调整。 一旦你确定你设计的模型在ReLU上运行得非常好,那么你可以尝试其他激活函数,并调整他们的参数来尝试提高一点准确性。

卷积核尺寸

有人可能会认为,使用更大的卷积内核将产生最高的精确度,但会导致更多的速度和内存的消耗。 然而,事实并非如此,因为人们发现使用更大的内核会使网络更难具有可区分性。而使用像3x3这样的更小的内核更为理想。 ResNet和VGGNet都相当彻底地解释和证明了这一点。 您还可以使用1x1内核作为瓶颈层来减少对对特征层进行降维,这些在这两篇论文中也有体现。

扩张卷积

扩张卷积通过增加卷积核权重之间的间隔来使卷积核有更大的感受野。 这允许网络接收域按指数扩展,却不增加参数计数,即不增加内存消耗。 事实证明,使用扩张卷积可以通过微小的速度代价来提高网络的准确性。

分类卷积神经网络综合设计指南_第4张图片

数据增强

你几乎总是在做数据增强。使用更多的数据已被证明能持续提高网络的性能以达到极限。通过数据增强,您可以免费获得更多数据。 数据增强的方法主要取决于你的应用场景。 例如,如果你正在做自动驾驶系统,那么你可能不需要底向上的树木,汽车和建筑物,因此垂直翻转图像是没有意义的。 但是,您肯定会遇到天气变化以及整个场景发生的一些变化,因此通过照明变化和水平翻转来增强您的数据是有意义的。 可以具体了解一下这个数据增强库。

优化方法

当你最终想要训练你的网络时,有几种优化算法可供选择。很多人都说SGD在准确性方面能有最好的结果,据我的经验,这是真的。 但是,调整SGD的学习率和参数可能会很困难且乏味的。另一方面,使用Adam,Adagrad或Adadelta这类学习速率自适应算法的学习速度快速且容易操作,但您可能无法获得SGD的最佳精确度。

最好的做法就是根据激活函数的确定遵循相同的策略:首先使用简单的优化算法去看看你的设计是否能够良好的运行,然后使用更复杂的算法进行调整和优化。我个人建议从Adam开始,因为根据我的经验,Adam算法很容易使用:只需设置一个不高的学习率,通常默认为0.0001,通常会得到一些非常好的结果! 稍后,您可以从头开始使用SGD,甚至可以从Adam开始,然后再与SGD一起优化。 事实上,这篇论文发现在训练中期将优化算法由Adam转换到SGD以最简单的方式实现最佳的准确性! 如下图所示:

分类卷积神经网络综合设计指南_第5张图片

类平衡

在很多情况下,您将处理类别不均衡的数据,尤其是在现实应用中。 举一个简单但真实的例子:您要训练一个深度网络以预测视频F中是否有人持有致命武器来确保场景的安全, 但是在你的训练数据中,你只有50个持有武器的人的视频和1000个没有武器的人的视频!如果你只是用这些数据来训练你的网络,那么你的模型肯定会更偏向于预测视频中没人持武器!

你可以通过下面几种操作来解决这个问题:

  • 在损失函数中使用类权重。本质上,代表性不足的类在损失函数中获得更高的权重,因此对于该特定类的任何错误分类将导致损失函数中的非常高的误差。
  • 过度抽样:重复采样代表性不足的类别那些训练样例有助于平衡分配。 如果可用数据很小,这种方法效果最好。
  • 欠采样:选取部分比较普遍的类。 如果可用数据非常大,这种效果最好。
  • 对数据量较少的类进行数据增强。   

优化你的迁移学习    

对于大多数应用来说,使用迁移学习而不是从头开始训练您的网络是非常适合。但是,您仍然会根据您的数据来选择保留哪些层,及重新训练哪些层。您的数据与预先训练的网络(通常在ImageNet上进行培训)的数据越相似,您应该重新训练的层数越少,反之亦然。例如,假设你想识别图像中是否包含葡萄,所以你有一堆葡萄和一堆没有的图像,这些图像与ImageNet中的图像非常相似,因此您只需重新训练最后几层,也许只是全连接层。然而,让我们说你想识别一个外太空图像中是否包含行星。那么这样的数据与ImageNet的数据有很大的不同,所以你也需要重新训练一些后来的卷积层。简而言之,遵循以下规则:

分类卷积神经网络综合设计指南_第6张图片

总结

现在您拥有了一份图像分类CNN设计的综合指南。 我希望你喜欢这篇文章,并且学到了一些新的有用的东西。

你可能感兴趣的:(分类卷积神经网络综合设计指南)