https://www.toutiao.com/a6701105630670750221/
“如果我们想让机器思考,我们需要教他们看(感知)” –
李飞飞
在本文中将讨论卷积神经网络的一些更复杂的方面,以及它们如何与特定任务相关,如对象检测和面部识别。
本文中将讨论的主题是:
-
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),并使用3×3卷积滤波器,专门使用相同的填充和1步幅,以及2×2最大池层,步长为2。
作者表明,两个3×3滤波器的有效感受区域为5×5,随着空间尺寸的减小,深度增加。该网络经过两到三周的训练,至今仍在使用 – 主要用于迁移学习。该网络最初是为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上训练的图像分类器?
通常情况下,图像分类模型可能需要数小时,数天甚至数周才能进行训练,特别是如果他们接受了特大型网络和数据集的训练。
但是,我们知道像谷歌和微软这样的公司拥有专门的数据科学家团队,他们花了数年时间开发出用于图像分类的特殊网络 – 为什么不将这些网络作为你自己的图像分类项目的起点呢?
这是
迁移学习
背后的想法,使用预先训练的模型,即具有已知权重的模型,以便将它们应用于不同的机器学习问题。显然,仅仅纯粹转移模型将没有用处,你仍然必须在新数据上训练网络,但通常会冻结前一层的权重,因为这些是更广义的功能,在训练期间可能会保持不变。你可以将此视为生成预初始化网络的智能方式,而不是具有随机初始化网络。
通常,在迁移学习中使用较小的学习速率而不是典型的网络训练,因为我们实质上是在调整网络。如果使用较大的学习率并且网络中的早期层未被冻结,则转移学习可能不会带来任何好处。通常,在迁移学习问题中训练的只是最后一层或最后几层。
迁移学习最适用于相当普遍的问题,并且网络上可以自由使用网络(例如图像分析),并且当用户拥有相对较小的数据集时,它不足以训练神经网络 – 这是一个相当普遍的问题。
总结主要思想:网络的前期层学习低级特征,通过改变后期和完全连接层的权重,可以适应新域。
这方面的一个例子是使用经过任何复杂的大型网络训练的ImageNet,然后在几千个热狗图像上重新训练网络。
Hotdog或NotHotDog
迁移学习的步骤如下:
- 获取现有网络权重
- 解冻”头部”完全连接的图层并训练你的新图像
- 解冻最新的卷积层并以非常低的学习速率训练,从先前训练的权重开始。这将改变最新的层卷积权重,而不会触发在我们没有完成#2时会发生的大梯度更新。