摘要: 本文是一篇关于使用CNN完成图像分类的综合设计指南,涵盖了一些模型设计、模型优化以及数据处理经验,是一份适合图像分类方向研究者参考的综合设计指南。算法
对于计算机视觉任务而言,图像分类是其中的主要任务之一,好比图像识别、目标检测等,这些任务都涉及到图像分类。而卷积神经网络(CNN)是计算机视觉任务中应用最为普遍且最为成功的网络之一。大多数深度学习研究者首先从CNN入门,上手的第一个项目应该是手写体MNIST数字图像识别,经过该项目可以大体掌握图像分类的基本操做流程,但因为该项目太成熟,按步骤操做一遍可能只知其然而不知其因此然。因此,当遇到其它图像分类任务时,研究者可能不知道如何开始,或者不知道选取怎样的预训练网络模型、或者不知道对已有的成熟模型进行怎样的调整、模型的层数怎样设计、如何提高精度等,这些问题都是会在选择使用卷积神经模型完成图像分类任务时应该考虑的问题。
当选择使用CNN进行图像分类任务时,须要优化3个主要指标:精度、仿真速度以及内存消耗。这些性能指标与设计的模型息息相关。不一样的网络会对这些性能指标进行权衡,好比VGG、Inception以及ResNets等。常见的作法是对这些成熟的模型框架进行微调、好比经过增删一些层、使用扩展的其它层以及一些不一样的网络训练技巧等完成相应的图像分类任务。
本文是关于使用CNN进行图像分类任务的优化设计指南,方便读者快速掌握图像分类模型设计中所遇到的问题及经验。全文集中在精度、速度和内存消耗这三个性能指标进行扩展,介绍不一样的CNN分类方法,并探讨这些方法在这三个性能指标上的表现。此外,还能够看到对这些成熟的CNN方法进行各类修改以及修改后的性能表现。最后,将学习如何针对特定的图像分类任务优化设计一个CNN网络模型。网络
网络类型和性能指标之间有一个很是明显的权衡现象。首先确定会选择Inception或ResNet网络类型的模型,由于这两个网络比VGG和AlexNet模型更新,只是在精度和仿真速度两个指标之间进行了权衡,若是想要精度,选择ResNet网络是个不错的开端,若是想要仿真速度快,那就选择Inception网络。框架
CNN整体设计的最新进展已经有一些使人惊叹的替代方案,在不损失太多精度的前提下,能够加快CNN仿真运行的时间并减小内存消耗。如下全部的这些均可以很容易地集成到上述CNN成熟模型之中:机器学习
对于CNN而言,有一些经常使用的方法是增长通道数以及深度来增长精度,可是会牺牲仿真运行速度和内存。然而,须要注意的是,层数增长对精度的提高的效果是递减的,即添加的层越多,后续添加的层对精度的提高效果越小,甚至会出现过拟合现象。ide
对于神经网络模型而言,激活函数是必不可少的。传统的激活函数,好比Softmax、Tanh等函数已不适用于CNN模型,有相关的研究者提出了一些新的激活函数,好比Hinton提出的ReLU激活函数,使用ReLU激活函数一般会获得一些好的结果,而不须要像使用ELU、PReLU或LeakyReLU函数那样进行繁琐的参数调整。一旦肯定使用ReLU可以得到比较好的结果,那么能够优化网络的其它部分并调整参数以期待更好的精度。函数
人们可能广泛认为使用较大的卷积核(好比5x五、7x7)老是会产生最高的精度,然而,并不老是这样。研究人员发现,使用较大的卷积核使得网络难以分离,最好的使用像3x3这样更小的内核,ResNet和VGGNet已经很好地证实了这一点。此外,也可使用1x1这样的卷积核来减小特征图(Feature map)的数量。性能
空洞卷积(Dilated Convolutions)使用权重之间的间距以便可以使用远离中心的像素,这种操做容许网络在不增长网络参数的前提下增大感觉野,即不增长内存消耗。相关论文代表,使用空洞卷积能够增长网络精度,但也增长仿真运行消耗的时间。学习
深度学习依赖于大数据,使用更多的数据已被证实能够进一步提高模型的性能。随着扩充的处理,将会免费得到更多的数据,使用的扩充方法取决于具体任务,好比,你在作自动驾驶汽车任务,可能不会有倒置的树、汽车和建筑物,所以对图像进行竖直翻转是没有意义的,然而,当天气变化和整个场景变化时,对图像进行光线变化和水平翻转是有意义的。这有一个很棒的数据扩充库。大数据
当对网络训练过程优化时,有几种优化算法可供选择。经常使用的算法是随机梯度降低算法(SGD),但该算法须要调整学习率等参数,这一过程略显乏味;另外使用自适应学习率梯度降低算法,好比Adam、Adagrad或Adadelta算法,是比较容易实现的,可是可能没法得到最佳的梯度降低算法精度。优化
最好的办法是遵循和激活函数相似的处理方式,先用简单的训练方法来看看设计的模型是否工做得很好,而后用更复杂的方式进行调整和优化。我的推荐从Adam开始,该方法使用起来很是容易:只须要设定一个不过高的学习率,一般默认设置为0.0001,这样通常会获得很是好的效果,以后可使用SGD算法进行微调。
在不少状况下,可能会遇到数据不平衡问题。数据不平衡是什么意思呢?举一个简单的例子:假设你正在训练一个网络模型,该模型用来预测视频中是否有人持有致命武器。可是训练数据中只有50个持有武器的视频,而有1000个没有持有武器的视频。若是使用这个数据集完成训练的话,模型确定倾向于预测视频中没有持有武器。
针对这个问题,能够作一些事情来解决:
对于大多数数据而言,通常的作法是使用迁移学习,而不是从头开始训练网络模型。迁移学习就是基于一些成熟的模型,使用其部分网络结构参数,只训练一些新的网络部件。在这个过程当中遇到的问题是,选择什么样的模型进行迁移学习,保留哪些网络层、哪些网络部件须要从新训练,这都取决于你的数据集是什么样子。若是你的数据与预训练的网络(网络通常是经过ImageNet数据集训练)更类似,那么须要从新训练的网络部件也越少,反之亦然。例如,假设正在尝试区一个图像是否包含葡萄,那么数据集是由包含葡萄的图像与不包含图像组成,这些图像与ImageNet中的图像很是类似,因此只须要从新训练选取的模型最后几层,也许只是训练最后的全链接层,由于ImageNet是区分1000类,而本次任务只区分两类——图像中包不包含葡萄,因此只需更改最后的全链接层参数。又假设正在尝试分类外太空图像中是否包含行星,这类的数据与ImageNet的数据集有很大的不一样,所以须要从新训练模型后面的卷积层。
本文是针对使用CNN完成图像分类任务的优化设计指南,给出了一些常见的优化方式,便于初学者按照给定的规则调整优化网络模型。
本文做者:George Seif,机器学习工程师,
本文由阿里云云栖社区组织翻译。
文章原标题《A Comprehensive Design Guide for Image Classification CNNs》,译者:海棠,审校:Uncle_LLD。
原文连接本文为云栖社区原创内容,未经容许不得转载。