卷积神经网络 第二周1-5 笔记

1.1 为什么要进行实例探究

一些卷积神经网络的实例分析是很有必要的,因为为研究找感觉的最好方法就是去看一些实例研究,就像很多人通过看大佬的代码来学习编程一样,我们学习卷积神经网络也可以从看一些实际而经典的例子开始;其次,实践证明,在计算机视觉任务中表现很好的神经网络框架往往也适用于其他任务。也就是说,如果有人已经训练出来擅长计算识别猫、狗、人的神经网络或者神经网络框架,而你的任务是构建一个自动驾驶汽车,那么你完全可以借鉴这些神经网络框架来解决自己的问题。
这一小节基本是这一周的提纲和目录,下面几个小节会用来详细研究各种经典的卷积神经网络。
在这里插入图片描述
了解这些神经网络,一定会对如何构建有效的卷积神经网络更有感觉。可能计算机视觉并不是你的主要方向,但是相信你会从ResNet & Inception网络这样的实例中找到一些不错的想法。毫不客气地说,这里面的很多想法都是多学科融合的产物,总之,即便你不打算构建计算机视觉的应用程序或者神经网络框架,试着从中发现一些有趣的思路也不错。

1.2 经典网络

这一节讲了三个经典的卷积神经网络,分别是LeNet-5 、AlexNet 和 VGGNet,他们各有各的特点。首先我们从第一个开始:

LeNet-5网络

在这里插入图片描述
假设你有一张32x32x1的图片,LeNet-5可以识别图中的手写数字,比如像上一周举的例子:手写数字7。LeNet-5网络是针对灰度图片训练的,所以图片的大小只有32x32x1。然后使用6个过滤器,步幅为1,padding为0,输出结果为28×28×6,图像尺寸从32×32缩小到28×28。之后进行池化操作,这个例子我们使用平均池化,过滤器的宽度为2,步幅为2,图像的尺寸,高度和宽度都缩小了2倍,输出结果是一个14×14×6的图像。接下来是卷积层,我们用一组16个5×5的过滤器,新的输出结果有16个通道。这个图像从14到14缩小到了10×10。然后又是池化层,高度和宽度再缩小一半,输出一个5×5×16的图像。将所有数字相乘,乘积是400。
下一层是全连接层,在全连接层中,有400个节点,每个节点有120个神经元,这里已经有了一个全连接层。但有时还会从这400个节点中抽取一部分节点构建另一个全连接层,就像这样,有2个全连接层。
最后一步就是利用这84个特征得到最后的输出,使用softmax函数输出有十个可能的值,对应识别0-9十个手写数字。
相比现代版本,这里得到的神经网络会小一些,只有约6万个参数。而现在,我们经常看到含有一千万到一亿个参数的神经网络,比这大1000倍的神经网络也不在少数。
不管怎样,如果我们从左往右看,随着网络越来越深,图像的高度和宽度在缩小,从最初的32×32缩小到28×28,再到14×14、10×10,最后只有5×5。与此同时,随着网络层次的加深,通道数量一直在增加,从1增加到6个,再到16个。
在这里插入图片描述
这个神经网络还有一个模式也很常用,就是一个或者多个卷积层后面跟着一个池化层,然后又是若干个卷积层再接着一个池化层,然后是全连接层,最后是输出。

AlexNet 网络

在这里插入图片描述
AlexNet首先用一张227×227×3的图片作为输入,实际上原文中使用的图像是224×224×3,但是如果你尝试去推导一下,你会发现227×227这个尺寸更好一些。第一层我们使用96个11×11的过滤器,步幅为4,由于步幅是4,因此尺寸缩小到55×55,缩小了4倍左右。然后用一个3×3的过滤器构建最大池化层,f = 3,步幅为2,则尺寸缩小为27×27×96,接着再执行一个5×5的卷积,padding之后,输出是27×27×276。然后再次进行最大池化,尺寸缩小到13×13。再执行一次same卷积,相同的padding,得到的结果是13×13×384,384个过滤器。再做一次same卷积,最后再进行一次最大池化,尺寸缩小到6×6×256。6×6×256等于9216,将其展开为9216个单元,然后是一些全连接层。最后使用softmax函数输出识别的结果,看它究竟是1000个可能的对象中的哪一个。

实际上,这种神经网络与LeNet有很多相似之处,不过AlexNet要大得多。正如前面讲到的LeNet或LeNet-5大约有6万个参数,而AlexNet包含约6000万个参数。当用于训练图像和数据集时,AlexNet能够处理非常相似的基本构造模块,这些模块往往包含着大量的隐藏单元或数据。AlexNet比LeNet表现更为出色的另一个原因是它使用了ReLu激活函数。
AlexNet网络结构看起来相对复杂,包含大量超参数,这些数字(55×55×96、27×27×96、27×27×256……)都是Alex Krizhevsky及其合著者不得不给出的。

VGG-16 网络

VGG-16网络没有那么多超参数,这是一种只需要专注于构建卷积层的简单网络。首先用3×3,步幅为1的过滤器构建卷积层,padding参数为same卷积中的参数。然后用一个2×2,步幅为2的过滤器构建最大池化层。这种网络的一大优点就是它确实简化了神经网络结构。

假设要识别这个图像,在最开始的两层用64个3×3的过滤器对输入图像进行卷积,输出结果是224×224×64,因为用了same卷积,所以通道数量不变。为了方便表示所以老师并没有把所有的层数画出来,而是用数字表示。
接下来创建一个池化层,池化层将输入图像进行压缩,从224×224×64缩小到112×112×64。然后又是若干个卷积层,使用129个过滤器,以及一些same卷积,然后进行池化,可以推导出池化后的结果是这样(56×56×128)。接着再用256个相同的过滤器进行三次卷积操作,然后再池化,然后再卷积三次,再池化。如此进行几轮操作后,将最后得到的7×7×512的特征图进行全连接操作,得到4096个单元,然后进行softmax激活,输出从1000个对象中识别的结果。

(1)VGG-16网络中的16代表的含义为:含有参数的有16个层,共包含参数约为1.38亿。
(2)VGG-16网络结构很规整,没有那么多的超参数,专注于构建简单的网络,都是几个卷积层后面跟一个可以压缩
图像大小的池化层。即:全部使用33的小型卷积核和22的最大池化层。
卷积层:CONV=33 filters, s = 1, padding = same convolution。
池化层:MAX_POOL = 2
2 , s = 2。

优点:简化了卷积神经网络的结构;
缺点:训练的特征数量非常大。随着网络加深,图像的宽度和高度都在以一定的规律不断减小

2.3 残差网络

  • 残差块:
    在这里插入图片描述
    正常的计算路径是像绿色线(主路径)所表示的那样,通过一层一层一步一步的计算得来的,而我们可以走一条捷径,就是将 a [ l ] a^{[l]} a[l]直接向后传递到神经网络深层,例如 a [ l + 2 ] a^{[l+2]} a[l+2](传递到线性激活之后,ReLU函数之前的地方)处理的函数公式就变成了右下角的公式了。这就产生了一个残缺块。这之中涉及到另一个术语:跳跃连接,就是说 a [ l ] a^{[l]} a[l]跳过了一层或者多层,从而将信息传递到了神经网络的更深层。
    ResNet网络的发明者们发现使用残差块可以训练更深的神经网络,甚至能达到一百次及其以上。

一个普通网络和一个残差网络的区别就是跳跃连接的有无。如下图所示:
在这里插入图片描述
蓝色的线就是使得普通网络变成残差网络的原因了。
理论上,一个神经网络的层数越深,训练错误就应该越来越少,但实际上,对于一个普通网络来说,随着层数的增加,训练的错误并不是单调递减的。但残差网络却能做到在层数很多的情况下仍然持续让错误减少。不仅如此,这种方法确实有助于解决梯度消失和梯度爆炸的问题,让我们在训练更深的网络时还保持良好的性能。

2.4 残差网络为什么有用?

先来看个例子,上节课我们了解到,一个网络深度越深,它在训练集上训练的效率就会有所减弱,这也是有时候我们不希望加深网络的原因。而事实并非如此,至少在训练ResNets网络时,并非完全如此。
在这里插入图片描述
结果表明,残差块学习这个恒等式函数并不难,跳跃连接使我们很容易得出两层相等。这意味着,即使给神经网络增加了这两层,它的效率也并不逊色于更简单的神经网络,因为学习恒等函数对它来说很简单。尽管它多了两层,也只把前一层的值赋值给更深的层。所以给大型神经网络增加两层,不论是把残差块添加到神经网络的中间还是末端位置,都不会影响网络的表现。
当然,我们的目标不仅仅是保持网络的效率,还要提升它的效率。想象一下,如果这些隐藏层单元学到一些有用信息,那么它可能比学习恒等函数表现得更好。而这些不含有残差块或跳跃连接的深度普通网络情况就不一样了,当网络不断加深时,就算是选用学习恒等函数的参数都很困难,所以很多层最后的表现不但没有更好,反而更糟。

而这个情况是在两个层具有相同的维度的情况下,这就是为什么ResNets网络使用了许多same卷积。当输入和输出具有不同维度的时候,我们就会在计算式中增加一个矩阵,在这一个例子里,它是一个256×128维度的矩阵,你不需要对矩阵做任何操作,它是网络通过学习得到的矩阵或参数,它是一个固定矩阵,padding值为0。
在这里插入图片描述
最后是一个实际的例子,是吴老师从论文中截取的。
在这里插入图片描述
这是原来的普通网络,拥有很多层数,常规的卷积层池化层*n加上最后的全连接层然后是输出。
在这里插入图片描述
当把网络变成残差网络之后,如果是卷积层,则维度相同直接套用一开始的公式即可,如果有很多池化层的话,你就要像刚才一样调整你的维度了。

2.5 网络中的网络及1x1卷积

在架构内容设计方面,其中一个比较有帮助的想法是使用1×1卷积。也许你会好奇,1×1的卷积能做什么呢?不就是乘以数字么?听上去挺好笑的,结果并非如此,我们来具体看看。
在这里插入图片描述
过滤器为1×1,这里是数字2,输入一张6×6×1的图片,然后对它做卷积,起过滤器大小为1×1×1,结果相当于把这个图片乘以数字2,所以前三个单元格分别是2、4、6等等。用1×1的过滤器进行卷积,似乎用处不大,只是对输入矩阵乘以某个数字。但这仅仅是对于6×6×1的一个通道图片来说,1×1卷积效果不佳。
在这里插入图片描述
如果是一张6×6×32的图片,那么使用1×1过滤器进行卷积效果更好。具体来说,1×1卷积所实现的功能是遍历这36个单元格,计算左图中32个数字和过滤器中32个数字的元素积之和,然后应用ReLU非线性函数。
1×1卷积可以从根本上理解为对这32个不同的位置都应用一个全连接层,全连接层的作用是输入32个数字,输出结果是6×6×#filters(过滤器数量),以便在输入层上实施一个非平凡(non-trivial)计算。
这种方法通常称为1×1卷积,有时也被称为Network in Network,在林敏、陈强和杨学成的论文中有详细描述。虽然论文中关于架构的详细内容并没有得到广泛应用,但是1×1卷积或Network in Network这种理念却很有影响力,很多神经网络架构都受到它的影响,包括下节课要讲的Inception网络。
在这里插入图片描述
假设这是一个28×28×192的输入层,你可以使用池化层压缩它的高度和宽度,这个过程我们很清楚。但如果通道数量很大,该如何把它压缩为28×28×32维度的层呢?你可以用32个大小为1×1的过滤器,严格来讲每个过滤器大小都是1×1×192维,因为过滤器中通道数量必须与输入层中通道的数量保持一致。但是你使用了32个过滤器,输出层为28×28×32,这就是压缩通道数的方法。当然如果你想保持通道数192不变,这也是可行的,1×1卷积只是添加了非线性函数,当然也可以让网络学习更复杂的函数,比如,我们再添加一层,其输入为28×28×192,输出为28×28×192。
1×1卷积层就是这样实现了一些重要功能的(doing something pretty non-trivial),它给神经网络添加了一个非线性函数,从而减少或保持输入层中的通道数量不变,当然如果你愿意,也可以增加通道数量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值