目录
- 第四门课 卷积神经网络(Convolutional Neural Networks)
-
- 第二周 深度卷积网络:实例探究(Deep convolutional models: case studies)
-
- 2.7 Inception 网络(Inception network)
- 2.8 使 用 开 源 的 实 现 方 案 ( Using open-source implementations)
第四门课 卷积神经网络(Convolutional Neural Networks)
第二周 深度卷积网络:实例探究(Deep convolutional models: case studies)
2.7 Inception 网络(Inception network)
在上节视频中,你已经见到了所有的 Inception 网络基础模块。在本视频中,我们将学习如何将这些模块组合起来,构筑你自己的 Inception 网络。
Inception 模块会将之前层的激活或者输出作为它的输入,作为前提,这是一个28×28×192 的输入,和我们之前视频中的一样。我们详细分析过的例子是,先通过一个 1×1的层,再通过一个 5×5 的层,1×1 的层可能有 16 个通道,而 5×5 的层输出为 28×28×32,共32 个通道,这就是上个视频最后讲到的我们处理的例子。
为了在这个 3×3 的卷积层中节省运算量,你也可以做相同的操作,这样的话 3×3 的层将会输出 28×28×128。
或许你还想将其直接通过一个 1×1 的卷积层,这时就不必在后面再跟一个 1×1 的层了,这样的话过程就只有一步,假设这个层的输出是 28×28×64。
最后是池化层。
这里我们要做些有趣的事情,为了能在最后将这些输出都连接起来,我们会使用 same类型的 padding 来池化,使得输出的高和宽依然是 28×28,这样才能将它与其他输出连接起来。但注意,如果你进行了最大池化,即便用了 same padding,3×3 的过滤器,stride 为 1,其输出将会是 28×28×192,其通道数或者说深度与这里的输入(通道数)相同。所以看起来它会有很多通道,我们实际要做的就是再加上一个 1×1 的卷积层,去进行我们在 1×1 卷积层的视频里所介绍的操作,将通道的数量缩小,缩小到 28×28×32。也就是使用 32 个维度为1×1×192 的过滤器,所以输出的维度其通道数缩小为 32。这样就避免了最后输出时,池化层占据所有的通道。
最后,将这些方块全都连接起来。在这过程中,把得到的各个层的通道都加起来,最后得到一个 28×28×256 的输出。通道连接实际就是之前视频中看到过的,把所有方块连接在一起的操作。这就是一个 Inception 模块,而 Inception 网络所做的就是将这些模块都组合到一起。
这是一张取自 Szegety et al 的论文中关于 Inception 网络的图片,你会发现图中有许多重复的模块,可能整张图看上去很复杂,但如果你只截取其中一个环节(编号 1),就会发现这是在前一页 ppt 中所见的 Inception 模块。
我们深入看看里边的一些细节,这是另一个 Inception 模块(编号 2),这也是一个Inception 模块(编号 3)。这里有一些额外的最大池化层(编号 6)来修改高和宽的维度。这是另外一个 Inception 模块(编号 4),这是另外一个最大池化层(编号 7),它改变了高和宽。而这里又是另一个 Inception 模块(编号 5)。
所以 Inception 网络只是很多这些你学过的模块在不同的位置重复组成的网络,所以如果你理解了之前所学的 Inception 模块,你就也能理解 Inception 网络。
事实上,如果你读过论文的原文,你就会发现,这里其实还有一些分支,我现在把它们加上去。所以这些分支有什么用呢?在网络的最后几层,通常称为全连接层,在它之后是一个 softmax 层(编号 1)来做出预测,这些分支(编号 2)所做的就是通过隐藏层(编号 3)来做出预测,所以这其实是一个 softmax 输出(编号 2),这(编号 1)也是。这是另一条分支(编号 4),它也包含了一个隐藏层,通过一些全连接层,然后有一个 softmax 来预测,输出结果的标签。
你应该把它看做 Inception 网络的一个细节,它确保了即便是隐藏单元和中间层(编号5)也参与了特征计算,它们也能预测图片的分类。它在 Inception 网络中,起到一种调整的效果,并且能防止网络发生过拟合。
还有这个特别的Inception网络是由Google公司的作者所研发的,它被叫做GoogleLeNet,这个名字是为了向 LeNet 网络致敬。在之前的视频中你应该了解了 LeNet 网络。我觉得这样非常好,因为深度学习研究人员是如此重视协作,深度学习工作者对彼此的工作成果有一种
强烈的敬意。
最后,有个有趣的事实,Inception 网络这个名字又是缘何而来呢?Inception 的论文特地提到了这个模因(meme,网络用语即"梗"),就是"我们需要走的更深"(We need to go deeper),论文还引用了这个网址(http://knowyourmeme.com/memes/we-need-to-go-deeper),
连接到这幅图片上,如果你看过 Inception(盗梦空间)这个电影,你应该能看懂这个由来。作者其实是通过它来表明了建立更深的神经网络的决心,他们正是这样构建了 Inception。我想一般研究论文,通常不会引用网络流行模因(梗),但这里显然很合适。
最后总结一下,如果你理解了 Inception 模块,你就能理解 Inception 网络,无非是很多个 Inception 模块一环接一环,最后组成了网络。自从 Inception 模块诞生以来,经过研究者们的不断发展,衍生了许多新的版本。所以在你们看一些比较新的 Inception 算法的论文时,会发现人们使用这些新版本的算法效果也一样很好,比如 Inception V2、V3 以及 V4,还有一个版本引入了跳跃连接的方法,有时也会有特别好的效果。但所有的这些变体都建立在同一种基础的思想上,在之前的视频中你就已经学到过,就是把许多 Inception 模块通过某种方式连接到一起。通过这个视频,我想你应该能去阅读和理解这些 Inception 的论文,甚至是一些新版本的论文。
直到现在,你已经了解了许多专用的神经网络结构。在下节视频中,我将会告诉你们如何真正去使用这些算法来构建自己的计算机视觉系统,我们下节视频再见。
2.8 使 用 开 源 的 实 现 方 案 ( Using open-source implementations)
你现在已经学过几个非常有效的神经网络和 ConvNet 架构,在接下来的几段视频中我想与你分享几条如何使用它们的实用性建议,首先从使用开放源码的实现开始。
事实证明很多神经网络复杂细致,因而难以复制,因为一些参数调整的细节问题,例如学习率衰减等等,会影响性能。所以我发现有些时候,甚至在顶尖大学学习 AI 或者深度学习的博士生也很难通过阅读别人的研究论文来复制他人的成果。幸运的是有很多深度学习的研究者都习惯把自己的成果作为开发资源,放在像 GitHub 之类的网站上。当你自己编写代码时,我鼓励你考虑一下将你的代码贡献给开源社区。如果你看到一篇研究论文想应用它的成果,你应该考虑做一件事,我经常做的就是在网络上寻找一个开源的实现。因为你如果能得到作者的实现,通常要比你从头开始实现要快得多,虽然从零开始实现肯定可以是一个很好的锻炼。
如果你已经熟悉如何使用 GitHub,这段视频对你来说可能没什么必要或者没那么重要。但是如果你不习惯从 GitHub 下载开源代码,让我来演示一下。
(整理者注:ResNets 实现的 GitHub 地址 https://github.com/KaimingHe/deep-residualnetworks)
假设你对残差网络感兴趣,那就让我们搜索 GitHub 上的 ResNets,那么你可以在 GitHub看到很多不同的 ResNet 的实现。我就打开这里的第一个网址,这是一个 ResNets 实现的GitHub 资源库。在很多 GitHub 的网页上往下翻,你会看到一些描述,这个实现的文字说明。这个 GitHub 资源库,实际上是由 ResNet 论文原作者上传的。这些代码,这里有麻省理工学院的许可,你可以点击查看此许可的含义,MIT 许可是比较开放的开源许可之一。我将下载代码,点击这里的链接,它会给你一个 URL,通过这个你可以下载这个代码。
我点击这里的按钮(Clone or download),将这个 URL 复制到我的剪切板里。
(整理者注:NG 此处使用的是 linux 系统的 bash 命令行,对于 win10 系统,可以开启linux 子系统功能,然后在 win10 应用商店下载 ubuntu 安装,运行 CMD,输入命令 bash 即可进入 linux 的 bash 命令行)
接着到这里,接下来你要做的就是输入 git clone,接着粘贴 URL,按下回车,几秒之内就将这个资源库的副本下载到我的本地硬盘里。
让我们进入目录,让我们看一下,比起 Windows,我更习惯用 Mac,不过没关系,让我们试一下,让我们进入 prototxt,我认为这就是存放这些网络文件的地方。让我们看一下这个文件。因为这个文件很长,包含了 ResNet 里 101 层的详细配置。我记得,从这个网页上看到这个特殊实现使用了 Caffe 框架。但如果你想通过其它编程框架来实现这一代码,你也可以尝试寻找一下。
如果你在开发一个计算机视觉应用,一个常见的工作流程是,先选择一个你喜欢的架构,或许是你在这门课中学习到的,或者是你从朋友那听说的,或者是从文献中看到的,接着寻找一个开源实现,从 GitHub 下载下来,以此基础开始构建。这样做的优点在于,这些网络通常都需要很长的时间来训练,而或许有人已经使用多个 GPU,通过庞大的数据集预先训练了这些网络,这样一来你就可以使用这些网络进行迁移学习,我们将在下一节课讨论这些内容。
当然,如果你是一名计算机视觉研究员,从零来实现这些,那么你的工作流程将会不同,如果你自己构建,那么希望你将工作成果贡献出来,放到开源社区。因为已经有如此多计算机视觉研究者为了实现这些架构做了如此之多的工作,我发现从开源项目上开始是一个更好
的方法,它也确实是一个更快开展新项目的方法。