Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

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

入门卷积神经网络模型架构
9
相关数据
激活函数技术

在 计算网络中, 一个节点的激活函数定义了该节点在给定的输入或输入的集合下的输出。标准的计算机芯片电路可以看作是根据输入得到"开"(1)或"关"(0)输出的数字网络激活函数。这与神经网络中的线性感知机的行为类似。 一种函数(例如 ReLU 或 S 型函数),用于对上一层的所有输入求加权和,然后生成一个输出值(通常为非线性值),并将其传递给下一层。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

VGG技术

2014年,牛津大学提出了另一种深度卷积网络VGG-Net,它相比于AlexNet有更小的卷积核和更深的层级。AlexNet前面几层用了11×11和5×5的卷积核以在图像上获取更大的感受野,而VGG采用更小的卷积核与更深的网络提升参数效率。VGG-Net 的泛化性能较好,常用于图像特征的抽取目标检测候选框生成等。VGG最大的问题就在于参数数量,VGG-19基本上是参数量最多的卷积网络架构。VGG-Net的参数主要出现在后面两个全连接层,每一层都有4096个神经元,可想而至这之间的参数会有多么庞大。

基准技术

一种简单的模型或启发法,用作比较模型效果时的参考点。基准有助于模型开发者针对特定问题量化最低预期效果。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

剪枝技术

剪枝顾名思义,就是删去一些不重要的节点,来减小计算或搜索的复杂度。剪枝在很多算法中都有很好的应用,如:决策树,神经网络,搜索算法,数据库的设计等。在决策树和神经网络中,剪枝可以有效缓解过拟合问题并减小计算复杂度;在搜索算法中,可以减小搜索范围,提高搜索效率。

过采样/欠采样技术

在信号处理中,过采样(英语:Oversampling)是指以远远高于信号带宽两倍或其最高频率对其进行采样的过程。

学习率技术

在使用不同优化器(例如随机梯度下降,Adam)神经网络相关训练中,学习速率作为一个超参数控制了权重更新的幅度,以及训练的速度和精度。学习速率太大容易导致目标(代价)函数波动较大从而难以找到最优,而弱学习速率设置太小,则会导致收敛过慢耗时太长

卷积技术

损失函数技术

在数学优化,统计学,计量经济学,决策理论,机器学习和计算神经科学等领域,损失函数或成本函数是将一或多个变量的一个事件或值映射为可以直观地表示某种与之相关“成本”的实数的函数。

降采样技术

降采样是数位信号处理领域中的一种多速频数字信号处理(multi-rate digital signal processing)系统中采样率转换(sample rate conversion)技术的一种,或指代用来降低信号采样率的过程,与插值相反——插值用来增加取样频率——降采样通常用于降低数据传输速率或者数据大小。因为降采样会有混叠的情形发生,系统中具有降采样功能的部分称为降频器(decimator)。

卷积神经网络技术

卷积神经网路(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。卷积神经网路由一个或多个卷积层和顶端的全连通层(对应经典的神经网路)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网路能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网路在图像和语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网路,卷积神经网路需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。 卷积网络是一种专门用于处理具有已知的、网格状拓扑的数据的神经网络。例如时间序列数据,它可以被认为是以一定时间间隔采样的一维网格,又如图像数据,其可以被认为是二维像素网格。

准确率技术

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

Alex网络技术

AlexNet是一个卷积神经网络的名字,最初是与CUDA一起使用GPU支持运行的,AlexNet是2012年ImageNet竞赛冠军获得者Alex Krizhevsky设计的。该网络达错误率大大减小了15.3%,比亚军高出10.8个百分点。AlexNet是由SuperVision组设计的,由Alex Krizhevsky, Geoffrey Hinton和Ilya Sutskever组成。

迁移学习技术

迁移学习是一种机器学习方法,就是把为任务 A 开发的模型作为初始点,重新使用在为任务 B 开发模型的过程中。迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务,虽然大多数机器学习算法都是为了解决单个任务而设计的,但是促进迁移学习的算法的开发是机器学习社区持续关注的话题。 迁移学习对人类来说很常见,例如,我们可能会发现学习识别苹果可能有助于识别梨,或者学习弹奏电子琴可能有助于学习钢琴。

MobileNets技术

MobileNet是专用于移动和嵌入式视觉应用的卷积神经网络,是基于一个流线型的架构,它使用深度可分离的卷积来构建轻量级的深层神经网络。通过引入两个简单的全局超参数,MobileNet在延迟度和准确度之间有效地进行平衡。MobileNets在广泛的应用场景中有效,包括物体检测、细粒度分类、人脸属性和大规模地理定位。

LeakyReLU技术

ReLU是将所有的负值都设为零,保留正值;相反,Leaky ReLU是给所有负值赋予一个非零斜率,即x<0时,y=α·x。

优化器技术

优化器基类提供了计算梯度loss的方法,并可以将梯度应用于变量。优化器里包含了实现了经典的优化算法,如梯度下降和Adagrad。 优化器是提供了一个可以使用各种优化算法的接口,可以让用户直接调用一些经典的优化算法,如梯度下降法等等。优化器(optimizers)类的基类。这个类定义了在训练模型的时候添加一个操作的API。用户基本上不会直接使用这个类,但是你会用到他的子类比如GradientDescentOptimizer, AdagradOptimizer, MomentumOptimizer(tensorflow下的优化器包)等等这些算法。

推荐文章
暂无评论
暂无评论~