卷积神经网络(二)

一、Why look at case studies    为什么要学习案例

        这一节我们将学习卷积神经网络的分析。在上一周中,我们学习了卷积神经网络的基本构件:卷积层、池化层以及全连接层。事实上,过去几年,人类一直在集中研究如何把这些基本构件组合到一起,形成有效的卷积神经网络。

        最好的方法就是多去看一些实际的案例,就像很多人通过看别人的代码来学习编程一样,通过研究别人构建有效组件的案例将会是一个不错的方法。实际上,在计算机视觉任务中表现良好的神经网络框架,往往也适用于其他任务。

1.1  Classic Networks 经典网络

LeNet-5、AlexNet、VGGNet

1.2  Residual Network 残差网络

ResNet(Residual Network):可以构建很深很深的神经网络(目前最深的好像有152层)

1.3  Inception Neural Network

上面这些都是非常有效的神经网络案例,接下来,我们将一一讲解。

 

二、Classic Networks 经典网络

2.1  LeNet-5

      LeNet-5模型是Yann LeCun教授于1998年提出来的,它是第一个成功应用于数字识别问题的卷积神经网络。在MNIST(手写数字识别)数据集中,它的准确率高达约99.2%。

       LeNet-5结构包含CONV layer(卷积层),POOL layer(池化层)和FC layer(全连接层),顺序一般是CONV1 layer --> POOL1 layer --> CONV2 layer --> POOL2 layer --> FC3 layer --> FC4 layer --> OUTPUT layer,即y^。

       下图所示为一个手写数字识别的LeNet-5模型结构:

卷积层:当时人们并不使用Padding,通常都是使用Valid卷积(Padding = 0)。这就是为什么每一次卷积之后,图像的高度和宽度都会缩小。

池化层与激活函数:当时Yann LeCun提出的LeNet-5模型池化层使用的是平均池化average pool,而且各层激活函数一般是Sigmoid和tanh。现在,我们可以根据需要做出改进,使用最大池化max pool激活函数ReLU

输出层:在现在版本中,输出层采用softmax分类器输出10种(0-9)分类结果,而当时的LeNet-5网络在输出层使用了另一种分类器(这里不展开讲,现在已经很少使用)。

该LeNet模型总共包含了大约6万个参数。

2.2  AlexNet

       AlexNet是以论文的第一作者Alex Krizhevsky的名字命名的,该模型是由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton共同提出的,其结构如下所示:

AlexNet与LeNet-5对比:

  1. 优点:AlexNet模型使用了ReLU激活函数。
  2. 缺点:AlexNet比LeNet-5要复杂一些,LeNet-5大约有6个参数,而AlexNet包含约6000个参数。

补充:AlexNet论文中几点深奥的地方

  1. 在写这篇论文的时候,GPU的处理速度还是比较慢。因此,AlexNet使用了非常复杂的方法在两个GPU上进行训练。原理是这些层被分别拆分到两个不同的GPU上,同时还专门有一个方法用于两个GPU之间进行交流.
  2. 经典的AlexNet结构还有另一种类型的层,称为“局部响应归一化层”,即LRN(Local Response  Normalization)层。而在实际应用中,LRN的效果不突出,并不常用。

2.3  VGG或VGG-16

VGG-16中16代表的是这个网络中包含16个卷积层和全连接层。一般情况下,其CONV layer和POOL layer参数设置如下:

CONV = 3x3 filters, s = 1, same卷积

MAX-POOL = 2x2, s = 2

VGG-16结构如下所示:

VGG-16的参数多达1亿3千万,每一组卷积层后过滤器翻倍操作

优点:简化了神经网络,结构并不复杂,很规整,几个卷积层后面跟着一个池化层

缺点:需要训练的特征数量很大

 

三、ResNets(Residual Network):可以构建很深很深的神经网络

一般来说,如果神经网络层数越多,网络越深,由于存在梯度消失和梯度爆炸的问题,整个模型难以训练成功。

解决方法:shotcut(捷径)或者skip connections(跳远连接),人为的让神经网络某些层跳过下一层神经元的连接,隔层相连,弱化每层之间的强联系。这种神经网络被称为Residual Networks(ResNets)。

Residual Networks由许多隔层相连的神经元子模块组成,我们称之为Residual block(残差块)。单个Residual block的结构如下图所示:

上图中红色部分就是skip connection,直接建立a[l]与a[l+2]之间的隔层联系。相应的表达式如下:

在残差网络中,a[l] 直接隔层与下一层的线性输出相连,与z[l+2] 共同通过ReLU激活函数输出a[l+2] 。我们称这条路径为shotcut,a[l] 的信息直接到达神经网络的深层,不再沿着主路径传递。

注意:这条路径是在线性函数之后,ReLu激活函数之前插入的。

该模型由Kaiming He, Xiangyu Zhang, Shaoqing Ren和Jian Sun共同提出。他们发现使用残差网络可以训练更深的神经网络。因此,构建一个ResNet(Residual Network)就是通过多个Residual block残差块堆积在一起,形成深度神经网络。 

实验表明,这种模型结构对于训练非常深的神经网络,效果很好。

在上图中,每两层增加一个shortcut构成一个残差块,5个残差块连接在一起构成一个残差神经网络。

与普通网络(无shortcut)相比,Residual Network能够训练更深层的神经网络,有效避免发生梯度消失和梯度爆炸。从下面两张图的对比中可以看出,随着神经网络层数增加,普通网络的实际性能会变差,训练误差会变大。理论上,随着网络深度的加深,网络的性能越好。但实际上,对于普通网络而言,如果没有残差块,网络深度越深,意味着优化算法的选取更加的复杂,训练误差会越来远大。然而,Residual Network的训练效果却很好,训练误差一直呈下降趋势,即便是网络的深度达到100多层也不例外。

 

四、 Why ResNets Work

如上图所示,输入x经过很多层神经网络后输出a[l]a[l] 经过残差块输出a[l+2]a[l+2] 的表达式为:

输入x经过Big NN后,若W[l+2]≈0,b[l+2]≈0 ,则:

可以看出,即使发生了梯度消失,W[l+2]≈0,b[l+2]≈0 ,也能直接建立al+2al 的线性关系,且al+2=al ,这其实就是identity function(恒等式函数)a[l] 直接连到a[l+2] ,这意味着,即使给神经网络增加了两层,效果上相当于直接忽略了a[l] 之后的这两层神经层。

这样,看似很深的神经网络,其实由于许多Residual blocks的存在,弱化削减了某些神经层之间的联系,实现隔层线性传递,而不是一味追求非线性关系,模型本身也就能“容忍”更深层的神经网络了。而且从性能上来说,这两层额外的Residual blocks也不会降低Big NN的性能。

关于残差网络,还有一点需要注意的问题:如果Residual blocks中a[l]  和a[l+2] 的维度不同,通常可以引入矩阵Ws ,与a[l] 相乘,使得Ws∙a[l] 的维度与a[l+2] 一致。参数矩阵Ws 有来两种方法得到:一种是将Ws 作为学习参数,通过模型训练得到;另一种是固定Ws 值(类似单位矩阵),不需要训练,Wsa[l] 的乘积仅仅使得al 截断或者补零。这两种方法都可行。

 

五、Network in Network and 1x1 Convolutions

林敏 Min Lin, 陈强Qiang Chen,杨学成Xuecheng Yang等人提出了一种新的卷积神经网络结构,即1x1卷积,也称Network in Network。

对于单通道图片而言,用1x1的过滤器进行卷积,意味着卷积操作等同于乘积操作,作用似乎不大,只是对输入矩阵乘以某个数字。但是这仅仅是对于单通道的图片而言,1x1卷积的效果不佳。

对于多通道图片而言,1x1过滤器进行卷积的效果会很好。具体来说,1x1卷积实现的功能是:遍历36(6*6)个单元格,将左图中的32个数字与过滤器的32个数字依次相乘,然后应用ReLu非线性激活函数。

以其中一个单元格为例,这32个数字具有不同的通道,乘以32个权重参数,然后应用ReLu激活函数得到输出,如下图所示。因此,1x1卷积可以从根本上理解为:这32个数字都应用一个全连接神经网络。Convolutions的作用实际上类似全连接层的神经网络结构。效果等同于普通神经网络中a[l]a[l+1] 的过程。

5.1  1x1 卷积的应用

      通过前面的学习,我们知道了可以通过池化层来缩减图片的宽度和高度。但是,如果通道的数量过多,那么可以使用1x1卷积缩减输入图片的通道数目,如下图所示:

      当然,如果我们想保持通道数量不变的话,那也是可以的,只需要将过滤器的数量设置为通道数量即可,这时候1x1卷积只是对输入做了非线性变化而已。

在下一节中,我们将学习1x1卷积在Inception网络中是如何压缩通道数量并减少计算成本的

 

六、Inception Network Motivation

        在构建卷积层时,我们需要确定过滤器的大小究竟是1x1、3x3……,或者要不要添加池化层。而Inception Network的作用就是代替人工来决定卷积层中过滤器的大小,或者确实是否需要创建卷积层或池化层,虽然网络构架因此变得复杂,但网络表现却非常好。

在单层网络上可以使用多个大小不同的过滤器,进行same卷积,把各过滤器下得到的输出拼接起来。除此之外,还可以将卷积层与池化层混合,同时实现各种效果。但是要注意使用same pool。

Inception Network由Christian Szegedy、Wei Liu刘伟、Yangqing Jia贾阳青、Pierre Sermanet、Scott Reed、Gragomir Anguelov、Dumitru Erhan、Vincent Vanhoucke、Andrew Robinovich等人提出。基本思想:不需要人为决定使用哪个过滤器或者是否需要池化层,而是由网络自行确定这些参数。我们可以给网络添这些参数的所有可能取值,然后把这些输出连接起来,让网络自己学习需要什么样参数,采用哪些过滤器组合。

6.1 The problem of computational cost  计算成本问题

不难发现,Inception Network有一个问题:计算成本。下面,我们来计算5x5过滤器在该模块中的计算成本。

        对于输出的每一个数字,我们都需要执行5x5x192次乘法运算,由于输出有28x28x32个数字,因此一共需要计算乘法的次数为28x28x32x5x5x192输出值个数x每一个输出值所需的乘法运算次数)=1.2亿。即使在现代,计算机执行1.2亿次乘法运算的成本还是相当高的。

为此,我们可以引入1x1 卷积来减少其计算量,结构如下图所示:

         使用1x1卷积将输入值从192个通道减少到16个通道,然后再对这个较小的中间层用过滤器进行卷积操作,得到最终的输出。通常我们把该1x1 Convolution称为“瓶颈层”(bottleneck layer),瓶颈层是网络中最小的部分。引入瓶颈层之后,总共需要的计算量为:28x28x16x192+28x28x32x5x5x16=1240万。明显地,虽然多引入了1x1 Convolution层,但是计算成本从1.2亿减少到0.124亿(原来的1/10),效果还是非常明显的。

        你们可能会有这么一个问题:通过瓶颈层大幅度减小计算成本,会不会对网络的性能产生影响。事实证明,只要合理构建瓶颈层,既可以显著减小计算成本,又不会减低网络性能。

6.2  总结

    在构建神经网络的时,我们不想决定过滤器的大小,或者要不要添加池化层,那么Inception Network是一个不错的选择。

 

七、Inception Network

        上一节中,我们学习了Inception网络是所有基础模块。我们使用1x1卷积来减少Inception Network计算成本,引入1x1卷积后的Inception 模块如下图所示:

        Inception网络所做的就是将多个Inception 模块组合到一起,如下图所示。我们会发现有很多重复的Inception 模块,可能整张图看上去很复杂,但是如果只是截取其中一个环节,就会发现这就是之前所讲的Inception 模块。

上述Inception网络除了由许多Inception模块组成之外,还有一些分支,这些分支是通过中间隐藏层来作为输出层Softmax进行预测,有利于防止发生过拟合。

        直到现在,我们已经了解了许多专用的神经网络结构,在下一节中,我们将学习如何真正地使用这些算法来构建自己的计算机视觉系统。

 

八、Using Open-Source Implementation 使用开源的实现方案

        事实证明,很多神经网络复杂细致,因而难以复制。有时候,甚至在顶尖大学中学习AI或者深度学习的博士生,也很难通过阅读别人的研究论文来复制别人的研究成果。幸运的是,有很多深度学习的研究者都习惯把自己的成果作为开发资源放到像GitHub之类的网站。如果我们看到一篇研究论文,想要应用它的研究成果,最好的方法就是首先在网络上寻找一个开源的实现,这通常比自己从头开始实现要快得多。

        本节主要介绍GitHub的使用,GitHub是一个面向开源及私有软件项目的托管平台,上面包含有许多优秀的卷积神经网络开源项目。关于GitHub具体内容不再介绍,有兴趣的小伙伴自行查阅。

 

九、Transfer Learning   迁移学习

如果我们要做一个计算机视觉的任务,从头开始训练权重参数或者从随机初始化权重参数开始,这样往往需要花费大量的时间和精力。我们可以下载别人已经训练好的网络结构权重,用这个作为预训练,然后转换到自己感兴趣的任务。

深度学习非常强大的功能:可以将已经训练好的模型的一部分知识(网络结构)直接应用到另一个类似模型中去。比如我们已经训练好一个猫类识别的神经网络模型,那么我们可以直接把该模型中的一部分网络结构应用到使用X光片预测疾病的模型中去。这种学习方法被称为迁移学习(Transfer Learning)

现在,我们想要构建一个猫的三分类模型,但是训练集数量不多。这时候我们需要从网上下载神经网络开源的实现,不仅仅把代码下载下来,同时还需要下载权重参数。

举个例子,比如我们下载好了ImageNet数据集(1000个类别)的实现网络模型。这个网络的softmax层的输出有1000种可能类别,我们可以去掉这个softmax层,然后构建自己的softmax层用来输出三类别的预测值。这就相当于我们把前面所有层的权重看做是冻结的,只需要训练和softmax层相关的权重参数即可

如果训练集数量足够多,这种情况下,我们需要冻结层数越少,可以训练层数越多。

当然,如果我们有非常多的训练数据集,我们只需将开源的网络和权重参数作为网络的初始化,用来代替随机初始化,然后训练整个网络。

这种做法使得模型更加精确,因为毕竟样本对模型的影响最大。选择哪种方法通常由数据量决定。

迁移学习可以保留原神经网络的一部分,再添加新的网络层。具体问题,具体分析,可以去掉输出层后再增加额外一些神经层。

 

 

十、Data Augmentation    数据扩充

大部分的计算机视觉任务都需要大量的数据,因此数据扩充是经常使用的一个技巧。常用的数据扩充方法:Mirroring(垂直镜像对称)、Random Cropping(随机裁剪)、Rotation(旋转)、Shearing、Local warping(局部弯曲)……

随机裁剪并不是一种完美的数据扩充方式。如果随机裁剪部分的无用信息过多,那么该数据就不合适。但是在实践中,这个方法还是比较实用的,因为大部分的数据还是包含有用信息的。

另一种数据扩充的方法:Color shifting(色彩转换)。color shifting就是对图片的R、G、B通道的像素加上或者减去不同的失真值,改变图片色调。

R、B:出现紫色

G、B:呈现黄色

除了随意改变RGB通道像素值外,还可以更有针对性地对图片的RGB通道应用算法:PCA color augmentation(PCA颜色增强),也就是对图片颜色进行主成分分析,对主要颜色通道的像素值增加或减少,可以采用高斯扰动做法。比如,如果图片呈现紫色(即主要含有R、B),然后PCA color augmentation算法就会对R、B增或减很多,而G变化相对较少一些,使得总体的颜色保持一致。

具体的PCA color augmentation做法可以查阅AlexNet的相关论文,同时可以寻找该算法的开源实现方法。

最后提一下,在构建大型神经网络的时候,数据扩充和数据训练可以由两个不同的线程来进行。过程如下:其中一个线程不断地从本地磁盘中读取图片数据,然后进行数据扩充,构成一个batchsize后传送到另一个线程中进行数据的训练,实现了数据扩充和数据训练的并行进行。

 

十一、State of Computer Vision    计算机视觉的现状

深度学习已经成功地应用于计算机视觉(computer vision)、自然语言处理(natural language processing)、语音识别(speech recognition)、在线广告(online advertising)、物流(logistics)等许多问题中。

Data VS Hand-engineering手工工程

神经网络需要数据,不同的网络模型所需的数据量是不同的。物体检测(Object dection)、图像识别(Image recognition)、语音识别(Speech recognition)所需的数据量依次增加。

一般来说,如果data较少,那么就需要更多的hand-engineering对已有data进行处理,比如上一节介绍的数据扩充,模型算法也会相对要复杂一些;如果data很多,可以构建深层神经网络,不需要太多的hand-engineering,模型算法也就相对简单一些。

在模型研究或者竞赛方面,有一些方法能够有助于提升神经网络模型的性能:

  1. Ensembling:train several networks independently and average their outputs.集成:独立地训练几个神经网络,并取它们输出的平均值。缺点:需要保持所有的不同网络,占内存
  2. Multi-crop at test time: Run classifier on multiple versions of test images and average results.

但是由于这两种方法计算成本较大,一般不适用于实际项目开发。

由于计算机视觉问题建立在小数据系统中,其他人已经完成了大量的网络架构的手工工程。一个神经网络在一个视觉问题上很有效,它通常也会解决其他视觉问题。所以,要建立一个实用的系统,我们最好先从其他人的神经网络架构入手,我们还要灵活使用开源代码:

  1. Use archittectures of networks published in the literature
  2. Use open source implementations if possible
  3. Use pretrained models and fine-tune on your dataset
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华科大胡子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值