如果我们想让机器思考,我们需要教他们看(感知) - 李飞飞
在本文中将讨论卷积神经网络的一些更复杂的方面,以及它们如何与特定任务相关,如物件检测和面部识别。
本文中将讨论的主题是:
CNN评论感受野和扩张的卷积显著性图转置卷积经典网络残余网络迁移学习这篇文章更具体地涉及深度学习在计算机视觉中的应用。
你只看一次(YOLO) - 2016年
CNN评论
CNN的独特方面如下:与完全连线的网络相比,引数(权重和偏差)更少。物件转换不变 - 它们不依赖于影象中特征的出现位置。可以容忍影象中的一些失真。能够概括和学习功能。需要网格输入。卷积层由滤波器,特征对映和启用函式形成。这些卷积层可以是完整的,相同的或有效的。
如果输入中的层数已知,我们可以确定给定卷积块的输出层数nᵢ,该阶段中的滤波器数量f,步幅的大小s和滤波器尺寸k,填充p(假设它是方形)。
池化层用于减少过拟合。完全连线的层用于将空间和通道特征混合在一起。每个卷积层对应于在影象上绘制特征图之后的影象,这是提取特征的方式。
明确输入和输出层的数量很重要,因为这决定了构成神经网络引数的权重和偏差的数量。网络中的引数越多,需要训练的引数越多,导致训练时间越长。训练时间对于深度学习非常重要,因为它是一个限制因素,除非你可以访问强大的计算资源,如计算丛集。
下面是一个示例网络,我们将为其计算引数总数。
在这个网络中,我们在卷积滤波器上有250个权重和10个偏差项。我们在max-pooling层上没有权重。在最大池化层之后,我们有13×13×10 = 1,690个输出元素。我们有一个200节点的完全连线层,在完全连线层中总生1,690×200 = 338,000个权重和200个偏置项。因此,我们在网络有338,460个引数需要接受训练。我们可以看到大多数训练的引数出现在完全连线的输出层。
每个CNN层都学习越来越复杂的滤波器。第一层学习基本特征检测滤波器,例如边缘和角落。中间层学习检测物件部分的滤波器 - 对于面部,他们可能学会对眼睛和鼻子做出反应。最后的图层具有更高的表示形式:它们学习识别不同形状和位置的完整物件。
特征图显示通过神经网络的不同卷积层增加特征的分辨率
感受野和扩张卷积
感知字段被定义为输入空间中特定CNN的特征正在检视(即受其影响)的区域。在5×5输入对映上应用核心大小为k=3×3,填充大小为p =1×1,步幅s=2×2 的卷积C,我们将得到一个3×3输出特征对映(绿色对映) 。在3×3特征图之上应用相同的卷积,我们将得到2×2特征图(橙色图)。
让我们再次以一维方式看待感受野,没有填充,步幅为1,核心大小为3×1。
我们可以跳过其中一些连线以建立扩张卷积,如下所示。
这种扩张的卷积以与正常卷积类似的方式工作,主要区别在于感受野不再由连续画素组成,而是由其他画素分开的各个画素组成。扩散卷积层应用于影象的方式如下图所示。
扩张卷积
下图显示了二维资料的扩张卷积。红点是过滤器的输入,其为3×3,绿色区域是由这些输入中的每一个捕获的感受野。感受野是每个输入(单位)到下一层的初始输入上捕获的隐含区域。
使用扩张卷积背后的动机是:
通过处理更高分辨率的输入来检测精细细节。更广泛的视角,用于捕获更多上下文资讯。执行时间更短,引数更少在下一节中,我们将讨论使用显著性对映来检查卷积网络的效能。
显著性图
显著性图是资料科学家可用于检查卷积网络的有用技术。它们可用于研究神经元的启用模式,以检视影象的哪些特定部分对于特定特征是重要的。让我们想象一下,你会得到一张狗的影象并要求对它进行分类。这对于人类来说非常简单,但是,深度学习网络可能不像你那么聪明,而是可能将其归类为猫或狮子。为什么这样做?
网络可能错误分类影象的两个主要原因:
偏见化训练资料没有正则化我们想要了解是什么让网络将某个类作为输出 - 这样做的一种方法是使用显著性图。显著性图是一种测量给定影象中特定类的空间支援的方法。
当我通过我的网络传输影象时,找到负责C类分数S(C)的画素。
对于任何函式f(x,y,z),我们可以通过在该点找到关于这些变数的偏导数,找到变数x,y,z对任何特定点(x 1,y 1,z 1)的影响。类似地,为了找到负责的画素,我们对C类取分数函式S,并对每个画素取部分导数。
这很难自己实现,但幸运的是,auto-grad可以做到这一点!该程式的工作原理如下:
通过网络正向传递影象。计算每个类的分数。对于除C类之外的所有类,在最后一层强制执行得分S的导数为0,对于C,将其设定为1。通过网络反向传播此梯度。渲染它们,你就有了显著性图。注意:在步骤#2中,我们将其转换为二进位制分类并使用概率,而不是执行softmax。
以下是显著性图的一些示例。
我们如何处理彩色影象?获取每个频道的显著性图,并采用最大值,平均值或使用所有3个频道。
以下是Jupyter notebook中的程式码片段:
from vis.visualization import visualize_saliency
from vis.utils import utils
from keras import activations
# Utility to search for layer index by name.
# Alternatively we can specify this as -1 since it corresponds to the last layer.
layer_idx = utils.find_layer_idx(model, \preds\)
plt.rcParams[figure.figsize] = (5,5)
from vis.visualization import visualize_cam
import warnings
warnings.filterwarnings(\ignore\)
# This corresponds to the Dense linear layer.
for class_idx in np.arange(10):
indices = np.where(test_labels[:, class_idx] == 1.)[0]
idx = indices[0]
f, ax = plt.subplots(1, 4)
ax[0].imshow(test_images[idx][..., 0])
for i, modifier in enumerate([None, \guided\, \relu\]):
grads = visualize_cam(model, layer_idx, filter_indices=class_idx,
seed_input=test_images[idx], backprop_modifier=modifier)
if modifier is None:
modifier = \vanilla\
ax[i+1].set_title(modifier)
ax[i+1].imshow(grads, cmap=\jet\)
该程式码产生在下面的显著性对映:
在下一节中,我们将讨论通过使用转置卷积进行上取样的想法。
转置卷积
到目前为止,我们所看到的卷积要么保持其输入的大小,要么使其变小。我们可以使用相同的技术使输入张量更大,此过程称为上取样。当我们在卷积步骤中进行时,它被称为转置卷积。为了说明转置卷积的工作原理,我们将看一些卷积的例子。
第一个是没有填充的典型卷积层的示例,作用于大小为5×5的影象。在卷积之后,我们最终得到3×3影象。
图片取自A. Glassner,Deep Learning,Vol。2:从基础到实践
现在我们看一个填充为1的卷积层。原始影象是5×5,卷积后的输出影象也是5×5。
图片取自A. Glassner,Deep Learning,Vol。2:从基础到实践
现在我们看一个填充为2的卷积层。原始影象是3×3,卷积后的输出影象也是5×5。
图片取自A. Glassner,Deep Learning,Vol。2:从基础到实践
当在Keras中使用时,例如在变分自动编码器的开发中,这些是使用上取样层实现的。希望如果你之前已经看到过,现在可以理解这些卷积层如何通过使用转置卷积来增加影象的大小。
在下一节中,我们将讨论一些经典网络的体系结构。这些网络中的每一个在某种意义上都是性的,用于转发深度卷积网络领域。
经典网络
在本节中将介绍一些CNN的经典架构。这些网络被用于深度学习领域的一些开创性工作中,并且经常用于迁移学习目的。提出类似于卷积神经网络的第一项研究由Kunihiko Fukushima于1980年撰写,被称为NeoCognitron1,受到哺乳动物视觉皮层发现的启发。福岛将NeoCognitron应用于手写字元识别。
到20世纪80年代末,已经制作了几篇论文,大大推动了该领域的发展。反向传播的概念首先由Yann LeCun于1985年以法语出版,紧随其后的是Waiber等人的TDNN。在1989年 - 开发了一个像反向传播训练的卷积式网络。最初的应用之一是LeCun等人。1989年,使用反向传播应用于手写邮政编码识别。
LeNet-5
与目前的做法相比,LeNet-5的配方有点过时了。这是20世纪末深度学习初期阶段开发的第一个神经架构之一。1998年11月,LeCun发表了他最受认可的论文之一,描述了用于文件识别的现代CNN架构,称为LeNet1。这不是他的第一次迭代,事实上,这是LeNet-5,但本文是关于LeNet的常被引用的出版物。
它使用卷积网络,然后使用完全连线的层汇集图层和完成。网络首先从高维特征开始,并在增加通道数量的同时减小其尺寸。该网络中有大约60,000个引数。
LeCun,Yann,et al。基于梯度的学习应用于文件识别。IEEE 86.11(1998)
AlexNet
AlexNet架构是深度学习中最重要的架构之一,引用次数超过25,000次 - 这在研究文献中几乎闻所未闻。AlexNet于2012年由多伦多大学的Alex Krizhevsky,Ilya Sutskever和Geoffrey Hinton开发,摧毁了2012年ImageNet大规模视觉识别挑战赛(ILSVRC)的竞争。该网络在ImageNet资料集上进行了训练,该资料集是使用资料增强功能的120万高分辨率(227x227x3)影象的集合,由1000个不同的类组成。模型的深度比当时任何其他网络都要大,并且使用GPU进行了5-6天的训练。该网络由12层组成,利用了丢包和智慧优化器层,是最早实现ReLU启用功能的网络之一,目前仍在广泛使用。该网络有超过6000万个引数进行优化(~255 MB)。
通过展示CNN的令人印象深刻的效能和潜在的好处,这个网络几乎单枪匹马地启动了AI。该网络赢得了ImageNet比赛的前5名误差为15.3%,比下一个亚军低了10.8个百分点。
ImageNet结果从2011年到2016年
我们将讨论赢得ILSVRC的其余网络,因为其中大多数是处于深度学习研究前沿的性网络。
ZFNet
该网络由纽约大学的Matthew Zeiler和Rob Fergus介绍,他们以11.2%的错误率赢得了ILSVRC 2013。网络减少了过滤器的尺寸,并训练了12天。本文介绍了一种名为反卷积网络的视觉化技术,该技术有助于检查不同的特征启用及其与输入空间的关系。
VGG16和VGG19
2014年,Simonyan和Zisserman(牛津大学)推出了VGG网络。该网络在其固有的简单性和结构方面具有性。它由16或19层(因此得名)组成,总共有1.38亿个引数(522 MB),并使用3x3卷积滤波器,专门使用相同的填充和1步幅,以及2x2最大池层,步长为2。作者表明,两个3x3滤波器的有效感受区域为5x5,随着空间尺寸的减小,深度增加。该网络经过两到三周的训练,至今仍在使用 - 主要用于迁移学习。该网络最初是为2014年的ImageNet挑战而开发的。
2014年ImageNet挑战赛; 16或19层1.38亿个引数(522 MB)。卷积层使用相同填充并且步幅s = 1。最大池化层使用过滤器大小f = 2和步幅s = 2。用于大规模影象识别的非常深的卷积网络
GoogLeNet(Inception-v1)
GoogLeNet网络由Szegedy等人介绍。该网络是ILSVRC 2014的赢家,击败了VGG架构。该网络引入了初始模组的概念 - 具有不同滤波器大小的并行卷积层。这里的想法是,我们没有一个先验知道哪个滤镜尺寸是最好的,所以我们只让网络决定。初始网络是通过连线其他初始模组而形成的。它包括几个softmax输出单元,以强制正规化。这是一个关键的想法,这对于未来架构的开发非常重要。
GoogLeNet(Inception-v1)架构。
另一个有趣的特征是最后没有完全连线的层,而是用平均池层替换。删除这个完全连线的层会使网络的引数比AlexNet少12倍,从而使训练速度更快。
GoogLeNet架构。
ResNet
第一个剩余网络由微软的He等人在2015年提出。该网络在多个类别中赢得了2015年ILSVRC。该网络背后的主要思想是剩余块。该网络允许开发极深的神经网络,其可以包含100层或更多层。这是性的,因为到目前为止,深度神经网络的发展受到消失梯度问题的抑制,当在大量层上传播和乘以小梯度时会出现这种问题。
作者认为,优化残差对映比原型神经架构更容易。此外,如果需要,残余块可以决定自行关闭。让我们比较普通网络和剩余网络的网络结构。普通的网络结构如下:
残余网络结构如下所示:
何开明,张翔宇,任少卿,孙健,计算机视觉与模式识别会议(CVPR),2016年6月影象识别深度学习。
描述该网络的等式是:
通过这种额外的连线,梯度可以更容易地向后移动。它成为一个灵活的块,可以扩充套件网络的容量,或简单地转换为不影响训练的身份功能。
18层和34层残留网络的示例训练。
残余网络顺序堆叠残余块。
这个想法是让网络变得更深,而不会增加训练的复杂性。
残余网络使用卷积层实现具有相同填充选项的块(即使在最大池化时)。这允许块学习身份功能。
设计人员可能希望减小功能的大小并使用有效填充。 - 在这种情况下,快捷方式路径可以实现一组新的卷积层,从而适当地减小大小。
这些网络变得庞大而且非常复杂,它们的图表看起来类似于描述发电厂功能的图表。这是这种网络的一个例子。
将之前ImageNet获胜者的误差值与ResNet配方的误差值进行比较,我们可以看到效能的明显提升。Alexnet(2012)的前5名误差为15.3%(第二名为26.2%),随后ZFNet(2013)实现了前8名误差14.8%(功能视觉化),其次是GoogLeNet(2014)误差为7.8%,然后是ResNet(2015)首次达到5%以下的精度。
DenseNet
最初由Huang等人提出。2016年作为ResNet理念的激进延伸。每个块使用每个先前的特征对映作为输入,有效地连线它们。这些连线意味着网络具有L(L + 1)/2个直接连线,其中L是网络中的层数。人们可以将该架构视为展开的递回神经网络。每个层都将自己的k个特征对映新增到此状态。增长率规定了每层为全球国家做出多少新资讯。这里的想法是我们在每个点都有所有以前的资讯。与直觉相反,该架构减少了所需引数的总数。
5层密集块,生长速率为k = 4.每层将所有前面的特征图作为输入。
网络的工作原理是,通过将每个层直接与每个其他层连线,允许每层的最大资讯(和梯度)流。通过这种方式,DenseNets通过特征重用来利用网络的潜力,这意味着无需学习冗余特征对映。DenseNet图层相对较窄(例如12个滤镜),它们只添加了一小组新的特征图。
DenseNet架构通常具有优于ResNet架构的效能,并且可以使用更少的引数实现相同或更高的精度,并且网络更容易训练。
各种ResNet和DenseNet架构的效能比较。
网络公式最初可能有点令人困惑,但它本质上是一个ResNet架构,分辨率块被密集块代替。密集连线具有正则化效果,可减少训练集大小较小的任务的过度拟合。
简化的DenseNet架构示意图。
值得注意的是,DenseNets不会将图层的输出要素图与传入的要素图相加,实际上它们会将它们连线起来:
特征图的尺寸在块内保持不变,但过滤器的数量在它们之间变化,这被称为增长率k。
以下是密集网络的完整架构。当我们以完整的分辨率检视网络时,这是相当复杂的,这就是为什么通常更容易以抽象的形式进行视觉化。
DenseNet的完整建筑布局。
总结
正如我们所看到的,在短短几年的时间里,我们已经从ImageNet资料集的错误率大约15%变为大约3的错误率4%。如今,最先进的网络能够始终如一地低于3%。在我们能够获得这些网络的完美分数之前还有很长的路要走,但在过去的十年中,进展速度相当惊人,而且应该从中看出为什么我们目前正在经历一场深刻的学习 - 我们已经从人类具有卓越视觉识别的阶段,到这些网络具有卓越视觉的阶段。
这推动了机器学习算法向需要大量使用影象分析的各种商业领域的转变,例如医学成像(检查脑部扫描,X射线,乳房X射线摄影扫描)和自动驾驶汽车(计算机视觉)。影象分析很容易扩充套件到视讯,因为这只是每秒多个影象帧的快速连续 - 尽管这需要更多的计算能力。
迁移学习
迁移学习是一个重要的课题,本文将概述迁移学习背后的基本思想,以便读者能够在感兴趣的情况下对其进行更多的研究。如何制作一个可以在几小时(几分钟)内在CPU上训练的影象分类器?
通常情况下,影象分类模型可能需要数小时,数天甚至数周才能进行训练,特别是如果他们接受了特大型网络和资料集的训练。
但是,我们知道像Google和微软这样的公司拥有专门的资料科学家团队,他们花了数年时间开发出用于影象分类的特殊网络 - 为什么不将这些网络作为你自己的影象分类专案的起点呢?
这是迁移学习背后的想法,使用预先训练的模型,即具有已知权重的模型,以便将它们应用于不同的机器学习问题。显然,仅仅纯粹转移模型将没有用处,你仍然必须在新资料上训练网络,但通常会冻结前一层的权重,因为这些是更广义的功能,在训练期间可能会保持不变。你可以将此视为生成预初始化网络的智慧方式,而不是具有随机初始化网络。
通常,在迁移学习中使用较小的学习速率而不是典型的网络训练,因为我们实质上是在调整网络。如果使用较大的学习率并且网络中的早期层未被冻结,则转移学习可能不会带来任何好处。通常,在迁移学习问题中训练的只是最后一层或最后几层。
迁移学习最适用于相当普遍的问题,并且网络上可以自由使用网络(例如影象分析),并且当用户拥有相对较小的资料集时,它不足以训练神经网络 - 这是一个相当普遍的问题。
总结主要思想:网络的前期层学习低阶特征,通过改变后期和完全连线层的权重,可以适应新域。
这方面的一个例子是使用经过任何复杂的大型网络训练的ImageNet,然后在几千个热狗影象上重新训练网络。
Hotdog或NotHotDog
迁移学习的步骤如下:
获取现有网络权重解冻头部完全连线的图层并训练你的新影象解冻最新的卷积层并以非常低的学习速率训练,从先前训练的权重开始。这将改变最新的层卷积权重,而不会触发在我们没有完成#2时会发生的大梯度更新。