近年来,深度学习的发展势头迅猛,要跟上深度学习的进步速度变得越来越困难了。几乎每一天都有关于深度学习的创新,而大部分的深度学习创新都隐藏在那些发表于arxiv和spinger等研究论文中。
本文介绍了部分近期深度学习的进展和创新,以及keras库中的执行代码,本文还提供了原论文的链接。
简洁起见,本文中只介绍了计算机视觉领域内比较成功的深度学习架构。
另外,文章基于已经掌握了神经网络的知识,并且对keras已经相当熟悉了的基础。如果你对这些话题还不太了解,强烈建议先阅读以下文章:
什么是深度学习“高级架构”?
不同类型的计算机视觉任务
各种深度学习架构
与一个简单的机器学习算法相比,深度学习算法包含了更加多样的模型。其中的原因是在建立一个完整的模型时,神经网络具有很大的灵活性。
有时,我们还可以把神经网络比作乐高积木,可以用它搭建任何简单或者复杂的小建筑。
我们其实可以将“高级架构”简单地定义为一个有着成功模型记录的深度学习架构,这样的“高级架构”主要出现在类似imagenet的挑战中,在这些挑战中,你的任务是解决问题,比如用给定的数据完成图像识别。简单来说,imagenet就是一项关于数据集的挑战,而其中的数据集是从ilsvr(imagenet大规模视觉识别)中获得的。
就像下文即将提到的架构,其中的每个架构之间都有细微的差别,而正是这些差别使它们区别于普通的模型,让它们在解决问题的时候发挥出普通模型不具备的优势。这些架构同样属于“深度模型”的范畴,因此它们的性能也很可能优于其相对应的“浅层模型”。
本文主要关注于“计算机视觉”,所以很自然地会涉及到“计算机视觉”的任务。顾名思义,“计算机视觉任务”就是建立一个能够复制完成人类视觉任务的计算机模型。这实质上意味着,我们视力所见和感知的内容是一个能够在人造系统中被理解和完成的程序。
物体识别/分类:在物体识别中,你会得到一张原始图像,而你的任务就是判断出这张图像属于哪一类别。
分类及定位:如果图像中只有一个对象,那么你的任务就是找到该对象的位置。这个问题应该更加具体地表述为“定位问题”。
物体检测:在物体检测中,你的任务是识别出物体处于图像中的什么位置。这些对象可能属于同一类别,也可能属于不同类别。
图像分割:图像分割是一项稍微复杂的任务,其目的是将图像的各个像素映射到其对应的各个类别。
目前,我们已经了解了深度学习“高级架构”,并探究了各种类型的计算机视觉任务。那么接下来,我们将列举出最重要的深度学习架构,并且对这些架构进行简单的介绍:
alexnet是第一个深度学习架构,它是由深度学习先锋之一——geoffrey hinton和他的同事们共同研究并引入的。alexnet是一个看似简单但功能非常强大的网络架构,它为现在深度学习的突破性研究铺平了道路。下图是alexnet架构:
从分解图中我们可以看出,alexnet其实就是一个简单的架构,其中的卷积层和聚积层相互叠加,最顶部的是全连接层。早在二十世纪八十年代,alexnet模型就已经被概念化描述了。alexnet区别于其他模型的关键在于它的任务规模,以及它用于训练的gpu规模。在八十年代,用于训练神经网络的是cpu。而alexnet率先使用gpu,将训练的速度提高了十倍左右。
虽然alexnet现在有些过时了,但它仍然是运用神经网络完成各种任务的起点。不管是完成计算机视觉任务,还是语音识别任务,都仍然需要alexnet。
<a href="https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf" target="_blank">original paper link</a>
<a href="https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf" target="_blank">link for code implementation</a>
“vgg net”是由牛津大学“视觉图像研究组”的研究人员引入的。vgg网络的最大特点是它的金字塔状,靠近图像的底部比较宽阔,而顶部的层相对窄且深。
如图所示,vgg net包含了连续的卷积层,卷积层后紧接着聚积层。聚积层负责让各个层变得更窄。在这篇由组内研究人员共同完成的论文中,他们提出了各种类型的网络,这些网络架构的主要差异是深度不同。
vgg网络的优势在于:
1.这是对一个特定任务进行基准测试非常有效的网络架构。
2.同时,网上有大量免费的vgg预训练网络,因此,vgg通常会被用于各种各样的应用程序。
而另一方面,vgg主要的缺陷在于如果从头开始训练的话,其训练速度会非常慢。即使是用一个相当不错的gpu,它还是需要超过一周的时间才能正常运行。
<a href="https://arxiv.org/abs/1409.1556" target="_blank">original paper link</a>
<a href="https://github.com/fchollet/keras/blob/master/keras/applications/vgg16.py" target="_blank">link for code implementation</a>
googlenet(又称“inceptionnet”)是由谷歌的研究人员们设计的一个网络架构。googlenet在2014年的 imagenet大赛中获得了冠军,证明了它是一个功能强大的模型。
在这个网络架构中,研究人员们不仅加深了网络深度(googlenet包含22个层,而vgg网络只有19个层),还研究出了一个叫做“inception模块”的新方法。
如上图所示,这个架构与我们之前看到的有序性架构相比,发生了巨大的改变。在单个层中出现了各种各样的“特征提取器”。这间接地提高了网络的性能,因为当处理任务时,网络在自我训练过程中的选择非常广泛。它既可以选择卷积输入,也可以选择直接将输入聚积起来。
最终的架构包含了许多一个个相互叠加的inception模块。大部分最上面的层都有它们自己的输出层,所以googlenet的训练与其他模型有细微的差别。但这些差别能够帮助模型更快地完成卷积,因为这些层不仅有共同的训练,还有各自独立的训练。
googlenet的优势有:
1.googlenet的训练速度比vggnet要快。
2.与预训练的vgg网络相比,预训练的googlenet所占规模更小。一个vgg模型所占空间可以超过500mb,而googlenet只占96mb。
目前为止,googlenet还没有直接的缺陷,但是文章中提出了一些有助于googlenet进一步完善的改变方案。其中有一个改变方案被称作“xceptionnet”,在这个网络中,“初始模块”的散度限制被提高了。理论上来说,其散度现在可以是无限的了。
<a href="https://arxiv.org/abs/1512.00567" target="_blank">original paper link</a>
<a href="https://github.com/fchollet/keras/blob/master/keras/applications/inception_v3.py" target="_blank">link for code implementation</a>
resnet是一个真正地定义了深度学习架构深度的网络架构。“残差网络”,也就是我们所说的resnet,包含了许多连续的“残差模块”,这些“残差模块”构成了resnet架构的基础。“残差模块”如下图所示:
简单来说,一个“残差模块”有两个选择——它可以选择在输入上执行一组函数,也可以选择跳过这些步骤。
与googlenet类似,这些“残差模块”相互叠加,从而形成一个完整的网络的。
由resnet引入的一些新技术有:
1.使用标准的sgd,而不是花哨的“自适应学习”技术。这是通过一个能够保持正常训练的初始化函数来完成的。
2.改变输入预处理的方式,先将输入分批,然后再输入至网络。
resnet的主要优势在于,成千上万的残差层都能用于建立一个网络,而且都能被用于训练。这与平常的“时序网络”稍有不同,“时序网络”的性能会因为层数的增加而降低。
<a href="https://arxiv.org/abs/1512.03385" target="_blank">original paper link</a>
<a href="https://github.com/fchollet/keras/blob/master/keras/applications/resnet50.py" target="_blank">link for code implementation</a>
据称,resnext是目前为止最先进的物体识别技术。resnext建立于inception和resnet的基础之上,是一个全新的、改良的网络架构。下图总结了resnext的一个残差模块:
<a href="https://arxiv.org/pdf/1611.05431.pdf" target="_blank">original paper link</a>
<a href="https://github.com/titu1994/keras-resnext" target="_blank">link for code implementation</a>
rcnn据说是用于解决物体识别问题的深度学习架构中最具影响力的网络架构。为了解决识别检测问题,rcnn试图框出图像中的所有物体,然后再识别图像中的物体具体是什么。其操作流程如下:
rcnn的结构如下图:
<a href="https://arxiv.org/abs/1506.01497" target="_blank">original paper link</a>
<a href="https://github.com/yhenon/keras-frcnn" target="_blank">link for code implementation</a>
yolo是目前为止最先进的实时图像识别系统,它是以深度学习为基础的。正如我们在下图中所看到的,它首先将图像分成一个个小方格;然后将识别算法一一运行于这些格子,判断每个格子分别属于什么物体类别,之后把同一类别的方格合并起来,形成一个个最准确的物体框。
这些操作都是各自独立完成的,因此能够实现实时运行。一秒内最多能够处理40张图像。
虽然与其对应的rcnn相比,yolo的性能降低了,但是它的实时处理功能在处理日常问题中仍有巨大的优势。以下是yolo网络架构:
<a href="https://pjreddie.com/media/files/papers/yolo.pdf" target="_blank">original paper link</a>
<a href="https://github.com/allanzelener/yad2k" target="_blank">link for code implementation</a>
squeezenet架构是一个功能更加强大的网络架构,它在类似移动平台这样的低宽带场景中非常有用。这个网络架构仅占4.9mb的空间,而inception则占超过100mb空间。这样显著的变化来源于一个叫做“fire模块”的结构。“fire模块”如下图所示:
下图为squeezenet的最终架构:
original paper link
<a href="https://arxiv.org/abs/1602.07360" target="_blank">original paper link</a>
<a href="https://github.com/rcmalli/keras-squeezenet" target="_blank">link for code implementation</a>
9. segnet
segnet是一个用于解决图像分割的深度学习架构。它包含了一系列处理层(编码器)以及一组用于像素分类的对应的解码器。下图总结了segnet的操作过程:
segnet的一个关键特征是:在分割图像中保留了高频率的细节,因为编码网络的聚积索引与解码网络的聚积索引是相互连接的。简言之,信息的传递是直接的,而不是通过间接的卷积实现的。segnet是处理图像分割问题时的最佳模型。
<a href="https://arxiv.org/abs/1511.00561" target="_blank">original paper link</a>
<a href="https://github.com/imlab-uiip/keras-segnet" target="_blank">link for code implementation</a>
<a href="https://arxiv.org/abs/1406.2661" target="_blank">original paper link</a>
<a href="https://github.com/bstriner/keras-adversarial" target="_blank">link for code implementation</a>
本文作者:图普科技