Deeplearnng.AI第四部分第二周、经典网络

2.1 为什么要看实际例子

2.2 经典网络(Classic networks)

  • LeNet-5.
  • AlexNet
  • VGGNet

LeNet-5

在这里插入图片描述首先看看 LeNet-5 的网络结构,假设你有一张 32×32×1 的图片,LeNet-5 可以识别图中的手写数字,比如像这样手写数字 7。LeNet-5 是针对灰度图片训练的,所以图片的大小只有 32×32×1。实际上 LeNet-5 的结构和我们上周讲的最后一个范例非常相似,使用 6 个 5×5 的过滤器,步幅为 1。由于使用了 6 个过滤器,步幅为 1, padding 为 0,输出结果为 28×28×6, 图像尺寸从 32×32 缩小到 28×28。那个时候用的池化层是平均池化层。这里的过滤器的宽度为 2,步幅为 2,图像的尺寸,高度和宽度都缩小了 2 倍,输出结果是一个 14×14×6 的图像。接下来是卷积层,我们用一组 16 个 5×5 的过滤器,新的输出结果有 16 个通道。LeNet-5 的论文是在 1998 年撰写的,当时人们并不使用 padding,或者总是使用 valid 卷积,这就是为什么每进行一次卷积,图像的高度和宽度都会缩小,所以这个图像从 14 到 14 缩小到了10×10。然后又是池化层,高度和宽度再缩小一半,输出一个 5×5×16 的图像。将所有数字相乘,乘积是 400。下一层是全连接层,在全连接层中,有 400 个节点,每个节点有 120 个神经元,这里已经有了一个全连接层。但有时还会从这 400 个节点中抽取一部分节点构建另一个全连接层,就像这样,有 2 个全连接层。最后一步就是利用这 84 个特征得到最后的输出,我们还可以在这里再加一个节点用来预测 y ^ \hat y 的值, y ^ \hat y 有 10 个可能的值,对应识别 0-9 这 10 个数字。在现在的版本中则使用 softmax函数输出十种分类结果,而当时的LeNet-5 的输出层用了另外一种现已很少用的分类器。
读到这篇经典论文时,你会发现,过去,人们使用 sigmod 函数和 tanh 函数,而不是ReLu 函数,这篇论文中使用的正是 sigmod 函数和 tanh 函数。这种网络结构的特别之处还在于,各网络层之间是有关联的,这在今天看来显得很有趣。

AlexNet

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

VGG-16

VGG-16 网络没有那么多超参数,这是一种只需要专注于构建卷积层的简单网络。首先用 3×3,步幅为 1 的过滤器构建卷积层,padding 参数为 same 卷积中的参数。然后用一个2×2,步幅为 2 的过滤器构建最大池化层。因此 VGG 网络的一大优点是它确实简化了神经网络结构,下面我们具体讲讲这种网络结构。在这里插入图片描述假设要识别这个图像,在最开始的两层用 64 个 3×3 的过滤器对输入图像进行卷积,输出结果是 224×224×64,因为使用了 same 卷积,通道数量也一样。接下来创建一个池化层,池化层将输入图像进行压缩,减少到 112×112×64。然后又是若干个卷积层,使用 129 个过滤器,以及一些 same 卷积112×112×128.接着再用 256 个相同的过滤器进行三次卷积操作,然后再池化,然后再卷积三次,再池化。如此进行几轮操作后,将最后得到的 7×7×512 的特征图进行全连接操作,得到 4096 个单元,然后进行 softmax 激活,输出从 1000 个对象中识别的结果。顺便说一下,VGG-16 的这个数字 16,就是指在这个网络中包含 16 个卷积层和全连接层。
有些文章还介绍了 VGG-19 网络,它甚至比 VGG-16 还要大,如果你想了解更多细节,阅读由 Karen Simonyan 和 Andrew Zisserman 撰写的论文。由于VGG-16 的表现几乎和 VGG-19 不分高下,所以很多人还是会使用 VGG-16。该论文的亮点是,文中揭示了,随着网络的加深,图像的高度和宽度都在以一定的规律不断缩小,每次池化后刚好缩小一半,而通道数量在不断增加,而且刚好也是在每组卷积操作后增加一倍。也就是说,图像缩小的比例和通道数增加的比例是有规律的。从这个角度来看,这篇论文很吸引人。

2.3 残差网络(Residual Networks-ResNets)

非常非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题。这节课我们学习跳跃连接(Skip connection),它可以从某一层网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。我们可以利用跳跃连接构建能够训练深度网络的 ResNets,有时深度能够超过 100 层,让我们开始吧。
ResNets 是由残差块(Residual block)构建的,首先我解释一下什么是残差块。

在这里插入图片描述在残差网络中有一点变化,我们将 a [ l ] a^{[l]} 直接向后,拷贝到神经网络的深层,在 ReLU 非线性激活函数前加上 a [ l ] a^{[l]} ,这是一条捷径。 a [ l ] a^{[l]} 的信息直接到达神经网络的深层,不再沿着主路径传递,这就意味着最后这个等式( a [ l + 2 ] = g ( z [ l + 2 ] ) a^{[l+2]}=g(z^{[l+2]}) )去掉了,取而代之的是另一个 ReLU 非线性函数,仍然对 z [ l + 2 ] z^{[l+2]} 进行 g 函数处理,但这次要加上 a [ l ] a^{[l]} ,即: a [ l + 2 ] = g ( z [ l + 2 ] + a [ l ] ) a^{[l+2]}=g(z^{[l+2]} +a^{[l]} ) , 也就是加上的这个 a [ l ] a^{[l]} 产生了一个残差块。
在这里插入图片描述
在上面这个图中,我们也可以画一条捷径,直达第二层。实际上这条捷径是在进行 ReLU非线性激活函数之前加上的,而这里的每一个节点都执行了线性函数和 ReLU 激活函数。所以 a [ l ] a^{[l]} 插入的时机是在线性激活之后, ReLU 激活之前。除了捷径,你还会听到另一个术语“跳跃连接”,就是指 a [ l ] a^{[l]} 跳过一层或者好几层,从而将信息传递到神·经网络的更深层。

在这里插入图片描述这并不是一个残差网络,而是一个普通网络(Plain network),这个术语来自 ResNet 论文。
下面把它变成 ResNet 的方法是加上所有跳跃连接,正如前一张幻灯片中看到的,每两层增加一个捷径,构成一个残差块。如下图所示,5 个残差块连接在一起构成一个残差网络。
在这里插入图片描述如果没有残差,没有这些捷径或者跳跃连接,凭经验你会发现随着网络深度的加深,训练错误会先减少,然后增多。而理论上,随着网络深度的加深,应该训练得越来越好才对。也就是说,理论上网络深度越深越好。但实际上,如果没有残差网络,对于一个普通网络来说,深度越深意味着用优化算法越难训练。实际上,随着网络深度的加深,训练错误会越来越多。但有了 ResNets 就不一样了,即使网络再深,训练的表现却不错,比如说训练误差减少,就算是训练深达 100 层的网络也不例外。有人甚至在 1000 多层的神经网络中做过实验,尽管目前我还没有看到太多实际应用。但是对x的激活,或者这些中间的激活能够到达网络的更深层。这种方式确实有助于解决梯度消失和梯度爆炸问题,让我们在训练更深网络的同时,又能保证良好的性能。也许从另外一个角度来看,随着网络越来深,网络连接会变得臃肿,但是 ResNet 确实在训练深度网络方面非常有效。

2.4 残差网络为什么有用? (Why ResNets Work?)

在这里插入图片描述上图来自ResNet的论文。

2.5 网络中的网络和 1x1 卷积(Network in Network and 1x1 Convolutions)

过滤器为 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 个数字(过滤器数量标记为 n c [ l + 1 ] n_c^{[l+1]} ,在这 36 个单元上重复此过程),输出结果是 6×6×#filters(过滤器数量),以便在输入层上实施一个 non-trivial 计算。这种方法通常称为 1×1 卷积,有时也被称为 Network in Network,在林敏、陈强和杨学成的论文中有详细描述。虽然论文中关于架构的详细内容并没有得到广泛应用,但是 1×1 卷积或 Network in Network 这种理念却很有影响力,很多神经网络架构都受到它的影响,包括下一节要讲的Inception网络。
举个 1×1 卷积的例子,相信对大家有所帮助,这是它的一个应用。假设这是一个 28×28×192 的输入层,你可以使用池化层压缩它的高度和宽度,这个过程我们很清楚。但如果通道数量很大,该如何把它压缩为 28×28×32 维度的层呢? 你可以用 32个大小为 1×1 的过滤器,严格来讲每个过滤器大小都是 1×1×192 维,因为过滤器中通道数量必须与输入层中通道的数量保持一致。但是你使用了 32 个过滤器,输出层为 28×28×32,这就是压缩通道数(n c )的方法,对于池化层我只是压缩了这些层的高度和宽度。

扫描二维码关注公众号,回复: 5300019 查看本文章

在这里插入图片描述
1×1 卷积层就是这样实现了一些重要功能的(doing something pretty non-trivial),它给神经网络添加了一个非线性函数,从而减少或保持输入层中的通道数量不变,当然如果你愿意,也可以增加通道数量。后面你会发现这对构建 Inception 网络很有帮助,我们放在下节课讲。

2.6 Inception网络简介(Inception network motivation)

构建卷积层时,你要决定过滤器的大小究竟是 1×1,3×3 还是 5×5,或者要不要添加池化层。而 Inception 网络的作用就是代替你来决定,虽然网络架构因此变得更加复杂,但网络表现却非常好,我们来了解一下其中的原理。例如,这是你 28×28×192 维度的输入层,Inception 网络或 Inception 层的作用就是代替人工来确定卷积层中的过滤器类型,或者确定是否需要创建卷积层或池化层,我们演示一下。

在这里插入图片描述如果使用 1×1 卷积,输出结果会是 28×28×#(某个值),假设输出为 28×28×64,并且这里只有一个层。
在这里插入图片描述如果使用 3×3 的过滤器,那么输出是 28×28×128。然后我们把第二个值堆积到第一个值上,为了匹配维度,我们应用 same 卷积,输出维度依然是 28×28,和输入维度相同,即高度和宽度相同。

在这里插入图片描述接着用 5x5 的卷积核,same卷积保持维数不变,输出28x28x32。

在这里插入图片描述最后再加一个maxpooling,same padding,步长为1,之后加了一个 1x1x192 的32个卷积输出为 28x28x32。

有了这样的 Inception 模块,你就可以输入某个量,因为它累加了所有数字,这里的最终输出为 32+32+128+64=256。Inception 模块的输入为 28×28×129,输出为 28×28×256。这就是 Inception 网络的核心内容,提出者包括 Christian Szegedy、刘伟、贾阳青、 Pierre Sermanet、Scott Reed、Dragomir Anguelov、Dumitru Erhan、Vincent Vanhoucke 和 Andrew Rabinovich。基本思想是 Inception 网络不需要人为决定使用哪个过滤器或者是否需要池化,而是由网络自行确定这些参数,你可以给网络添加这些参数的所有可能值,然后把这些输出连接起来,让网络自己学习它需要什么样的参数,采用哪些过滤器组合。

但是所描述的Inception层有一个问题,即计算量大。下面我们来看看这个 5x5 的卷积核在该模块中的计算量。
在这里插入图片描述我们把重点集中在前一张幻灯片中的 5×5 的过滤器,这是一个 28×28×192 的输入块,执行一个 5×5 卷积,它有 32 个过滤器,输出为 28×28×32。前一张幻灯片中,我用一个紫色的细长块表示,这里我用一个看起来更普通的蓝色块表示。我们来计算这个 28×28×32 输出的计算成本,它有 32 个过滤器,因为输出有 32 个通道,每个过滤器大小为 5×5×192,输出大小为 28×28×32,所以你要计算 28×28×32 个数字。对于输出中的每个数字来说,你都需要执行 5×5×192 次乘法运算,所以乘法运算的总次数为每个输出值所需要执行的乘法运算次数(5×5×192)乘以输出值个数(28×28×32),把这些数相乘结果等于 1.2 亿。即使在现在,用计算机执行 1.2 亿次乘法运算,成本也是相当高的。下一张幻灯片会介绍 1×1 卷积的应用,也就是我们上节课所学的。为了降低计算成本,我们用计算成本除以因子 10,结果它从 1.2 亿减小到原来的十分之一。请记住 120 这个数字,一会还要和下一页看到的数字做对比。
在这里插入图片描述这里还有另外一种架构,其输入为 28×28×192,输出为 28×28×32。其结果是这样的,对于输入层,使用 1×1 卷积把输入值从 192 个通道减少到 16 个通道。然后对这个较小层运行5×5 卷积,得到最终输出。请注意,输入和输出的维度依然相同,输入是 28×28×192,输出是 28×28×32,和上一页的相同。但我们要做的就是把左边这个大的输入层压缩成这个较小的的中间层,它只有 16 个通道,而不是 192 个。接下来我们看看这个计算成本,应用 1×1 卷积,过滤器个数为 16,每个过滤器大小为1×1×192,这两个维度相匹配(输入通道数与过滤器通道数),28×28×16 这个层的计算成本是,输出 28×28×192 中每个元素都做 192 次乘法,用 1×1×192 来表示,相乘结果约等于 240万。240 万只是第一个卷积层的计算成本,第二个卷积层的计算成本又是多少呢?这是它的输出,28×28×32,对每个输出值应用一个 5×5×16 维度的过滤器,计算结果是 28x28x5x5x16x32=1000 万。
所以所需要乘法运算的总次数是这两层的计算成本之和,也就是 1240 万,与上上张图中的值做比较,计算成本从 1.2 亿下降到了原来的十分之一,即 1240 万。所需要的加法运算与乘法运算的次数近似相等,所以我只统计了乘法运算的次数。

2.7 Inception网络(Inception network)

在上节中,你已经见到了所有的 Inception 网络基础模块。在本视频中,我们将学习如何将这些模块组合起来,构筑你自己的 Inception 网络。

在这里插入图片描述

有一个 28x28x192的输入。
一、用64个 1x1 卷积作用得到 28x28x64的输出,
二、用96个 1x1 卷积作用得到 28x28x96的中间值,接着用 128个 3x3 的same卷积作用得到 28x28x128的输出,
三、用16个 1x1 卷积作用得到 28x28x16的中间输出,接着用32个 5x5 的same卷积作用得到 28x28x32的输出,
四、用 3x3 padding=same,步长为1的maxpool作用得到 28x28x192的中间输出,接着用32个 1x1 的卷及作用得到 28x28x32 的输出。
把这些通道叠起来得到一个 28x28x256 的输出。这就是一个 Inception 模块,而 Inception 网络所做的就是将这些模块都组合到一起。

在这里插入图片描述这是一张取自 Szegety et al 的论文中关于 Inception 网络的图片,你会发现图中有许多重复的模块,可能整张图看上去很复杂,但如果你只截取其中一个环节,就会发现这是在前面所见的 Inception 模块。
最后,有个有趣的事实,Inception 网络这个名字又是缘何而来呢?Inception 的论文特地提到了这个模因(meme,网络用语即“梗”),就是“我们需要走的更深”(We need to godeeper),论文还引用了这个网址(http://knowyourmeme.com/memes/we-need-to-go-deeper),连接到这幅图片上,如果你看过 Inception(盗梦空间)这个电影,你应该能看懂这个由来。

猜你喜欢

转载自blog.csdn.net/anny0001/article/details/86515756