选自hackernoon
机器之心编译
参与: Nurhachu Null、刘晓坤
这篇文章可以作为一个设计指南,为特定分类义务的 CNN 设计提供指点。作者围绕精确率、速度、内存耗费三个目标的权衡,从网络类型、架构设计、数据处置和迁移学习等方面引见了 CNN 设计进程中运用的办法。
你想开端做图像分类,但是无从着手。应该运用哪个预训练网络?如何修正网络以使其满足需求?你的网络应该包括 20 层还是 100 层?哪些是最快的、最精确的?这些是你为图像分类选择最好的 CNN 时会遇到的众多成绩。
中选择 CNN 来停止图像分类时,有 3 个十分次要的目标需求去优化:精确率、速度和内存耗费。在这些目标上的功能取决于你所选择的 CNN 以及对它所做的任何修正。不同的网络(如 VGG、Inception 以及 ResNet 等)在这些目标上有不同的权衡。此外,你还可以修正这些网络构造,例如经过增添某些层、添加某些层、在网络外部运用扩张卷积,或许不同的网络训练技巧。
这篇文章可以作为一个设计指南,为特定的分类义务的 CNN 设计提供指点。尤其是,我们集聚焦在 3 个次要目标上:精确率、速度和内存耗费。我们会研讨很多不同的分类 CNN,并探究它们在这 3 个目标方面对应的属性。我们还会研讨对这些根本 CNN 能够做出的修正,以及这些修正会怎样影响这些目标。最初,我们会研讨如何为特定图像分类义务最优地设计 CNN。
网络类型
在网络类型和这 3 个目标上有着明白的权衡。首先,你一定会希望运用 Inception 或许 ResNet 类型的设计。它们比 VGGNet 和 AlexNet 更新,而且在速度和精确率之间提供了更好选择的权衡(正如你在上图中看到的)。斯坦福大学的 Justin Johnson 对其中的一局部做了很棒的基准测试(https://github.com/jcjohnson/cnn-benchmarks)。
Inception 和 ResNet 的选择的确是速度和精确率的权衡:要精确率,用超深层的 ResNet;要速度,用 Inception。
运用巧妙的卷积设计来增加运转工夫和内存耗费
对 CNN 普通设计的最新停顿曾经提出了一些十分棒的可选择办法,它们可以在没有太多的精确率损失的状况下减速 CNN 的运转,并增加内存耗费。一切的这些办法都可以很容易地集成在上述的任何一类卷积神经网络中。
- MobileNets(https://arxiv.org/pdf/1801.04381.pdf)运用深度别离的卷积来极大地增加运算和内存的耗费,同时仅牺牲 1% 到 5% 的精确率,精确率的牺牲水平取决于你想要取得的计算浪费。
- XNOR-Net(https://arxiv.org/pdf/1603.05279.pdf)运用二进制卷积,也就是说,卷积运算只触及两个能够的数值:0 或许我国这片创新热土正在发生一场全面而深刻的产业结构变革。 1。经过这种设计,网络可以具有较高水平的稀疏性,易于被紧缩而不耗费太多内存。
- ShuffleNet(https://arxiv.org/pdf/1707.01083.pdf)运用点组卷积和通道随机化来极大地增加计算代价,同时还能维持比 MobileNets 高的精确率。现实上,它们可以在超越 10 倍的运算速度下到达晚期最先进的分类 CNN 的精确率。
- Network Pruning(https://arxiv.org/pdf/1605.06431.pdf)是为了增加运转工夫和内存耗费而删除 CNN 的局部权重的技术,而且有希望不降低精确率。为了坚持精确率,被删除的局部应该对最终后果没有大的影响。链接中的论文展现了运用 ResNets 可以随便地做到这一点。
网络深度
这个比拟容易:通常添加更多地层会提升精确率,同时会牺牲一些速度和内存。但是,我们曾经认识到的是这种权衡受制于边沿效应,也就是说,我们添加的层越多,经过添加每一层而带来的精确率提升将越少。
激活函数
关于激活函数,最近有很多争议。但是,很好的一个经历规律就是从 ReLU 开端。运用 ReLU 通常会在开端的时立刻失掉一些好的后果。不像 ELU、PReLU 或许 LeakyReLU 一样还需求一些繁琐的调整。当你确定你的设计运用 ReLU 可以到达不错的效果,那你就可以调整其它的局部,并调整它们的参数,以尝试对精确率做最初的提升。
卷积核大小
你也许以为运用更大的卷积核总会招致最高的精确率,同时还会损失速度和内存。但是,状况并不总是如此,由于研讨中屡次发现运用较大的卷积核会使得网络难以发散。运用更小的核(例如 3×3)会更好一些。ResNet 和 VGGNet 都相当片面的诠释了这一点。正如这两篇论文所展现的,你也可以运用 1×1 的核来增加特征的数目。
空泛卷积
为了可以运用远离中心的像素,空泛卷积(Dilated Convolution)在卷积核的权重之间运用空格。这使得网络不必添加参数数目就可以指数级地扩展感受野,也就是说基本没有添加内存耗费。曾经证明,空泛卷积可以在巨大的速度权衡下就能添加网络精确率。
数据加强
你应该常常做数据加强。运用更多的数据曾经被证明可以继续地加强功能,甚至到达极限(https://arxiv.org/pdf/1707.02968.pdf)。运用数据加强,你可以收费取得更少数据。加强类型取决于你的使用。比方,假如你做的是无人车的使用,你能够会遇到路上的车、树以及修建物,所以,将你的图像垂直翻转是没有意义的。但是,你一定会遇到由于天气变化或许场景变化而惹起的光线改动,经过改动光线和程度翻转来加强数据是有意义的。可以看一下这个数据加强库(https://github.com/aleju/imgaug)
训练优化器
当你最终要训练网络的时分,有几种可以选择的优化算法。很多人说 SGD 在精确率方面会失掉最好的后果,在我的经历看来,这是正确的。但是,调整学习率设置和参数是单调的,也是具有应战性的。另一方面,虽然运用自顺应的学习率(例如 Adam,、Adagrad 或许 Adadelta)比拟容易,也比拟疾速,但是你能够得不到和 SGD 一样的最优精确率。
最好就是让优化器遵照和激活函数一样的「作风」:先运用最容易的,看看它能否见效,然后运用更复杂的来调理和优化。我团体引荐以 Adam 作为开端,由于依据我的经历,它最容易运用:设置一个不太高的学习率,普通默许 0.0001,然后你通常会失掉一些十分好的后果。随后你可以从零开端运用 SGD,或许甚至以 Adam 作为开端,然后运用 SGD 精调。现实上, 这篇文章 发现运用 Adam,两头换到 SGD,可以以最容易的方式到达最好的精确率。看一下论文中的这张图:
类别平衡
很多状况下你会遇到不平衡数据,尤其是在理想使用中。举一个理想中的复杂例子:由于安检缘由,你在训练深度网络来预测输出视频中的某人能否持有杀伤性武器。但是在你的训练数据中,你只要 50 个视频中的人持有武器,而 1000 个视频中的人是没有持有武器的!假如你立刻运用这些数据训练你的网络,你的模型一定会以很高的偏向倾向于预测某人未持有武器。
可以用以下的办法来处理类别不平衡成绩:
- 在损失函数中运用类别权重。实质上,样本数量缺乏的类别在损失函数中承受较高的权重,这样的话特定类别的误分类会在损失函数中招致较高的误差。
- 过采样:对训练样本中数量缺乏的类别停止反复采样,这样有助于样本散布的平衡化。当可用数据较少的时分这个办法最能见效。
- 降采样:你也可以复杂地跳过包括过多样本的类别中的一些训练样本。当可用数据十分多的时分,这个办法最见效。
- 数据加强:对多数类别的数据停止数据扩增。
优化你的迁移学习
对大少数使用而言,运用迁移学习要比从零开端训练网络愈加适宜。但是,需求选择的是:你要舍弃哪些层,保存哪些层。这十分依赖于你的数据。你的数据和预训练网络(通常是在 ImageNet 上训练)所用的数据越类似,你需求重新训练的层就越少,反之亦然。例如,假定你要训练网络来区分一张图片能否包括葡萄,所以你会有少量的包括葡萄和不包括葡萄的图像。这些图像和 ImageNet 中运用的图像相当类似,所以你仅仅需求重新训练最初几层,或许只需求重新训练全衔接层。但是,假使你要分类的是一幅外太空的图像能否包括一颗行星可以,这种数据和 ImageNet 中的数据大有不同,所以你还需求重新训练后边的卷积层。简而言之,应该遵照以下的准绳:
总结
本文给出了用于图像分类使用而设计 CNN 的片面指南。希望你可以愉快地阅读本文,并学到一些新的、有用的东西。
原文链接:
https://hackernoon.com/a-comprehensive-design-guide-for-image-classification-cnns-46091260fb92