在 2014 年 ILSVRC 比赛中,VGGNet 获得了当时的第二名的成绩,那么第一名是谁呢?当时的 VGGNet 就已经很厉害了,难得同届选手还有更厉害的?很不巧,还真有。当年度取得冠军的方案网络由谷歌团队研发,并且为了致敬 Yann Lecun 的 LeNet-5,将其命名为 GoogLeNet。GoogLeNet 在借鉴 1x1 卷积思想的基础上,通过滤波器组合构建 Inception 模块,使得网络可以走向更深且表达能力更强。从 2014 年获得当届 ILSVRC 冠军的 Inception v1 到现在,光 Inception 网络就已经更新到 v4 了,而后基于 Inception 模块和其他网络结构的组合而成的网络就更多了,比如说 Inception Resnet。
1x1 卷积
通过前面的学习大家都知道卷积操作是卷积神经网络的核心操作了,在之前我们通常会用到各种尺寸的卷积核,比如说 3x3 卷积、5x5 卷积、7x7 卷积等等。但今天我们需要提一下 1x1 卷积。这似乎有些蠢,直观上理解 1x1 卷积好像没什么用,就是简单的数字相乘而已,对于通道数较小的图片确实如此,但如果我们考虑一个 6x6x32 的图片呢?
考虑用一个 1x1x32 的卷积核对 6x6x32 的图片进行卷积。如下图所示,具体而言就是计算左图中 32 个数字和卷积核中 32 个数字对应元素乘积之和,然后进行激活操作。
滤波器中的通道数 32 可以这么理解:一个神经元的输入是 32 个数字,对输入图像做一个切片的话,即相同高度和宽度上某一切片上的 32 个数字具有不同的通道数,乘以滤波器的 32 个数字权重,然后应用激活函数得到 1x1 卷积结果。所以从这个角度看我们可以将 1x1 卷积理解为对这个不同通道上的 32 个数字应用一个全连接层,这个全连接层输入 32 个数字,输入为 6x6x滤波器个数。
所以 1x1 卷积的一个重要作用就是缩减通道数,对于一个 28x28x192 的输入,我们如何将其压缩成 28x28x32 的大小呢?利用 1x1 卷积的话就是使用 32 个大小为 1x1x192 的卷积核进行卷积,卷积结果大小为 28x28x32。这样就起到了压缩通道的作用了,这种压缩或保持通道数不变的方法在接下来我们要讲的 GoogLeNet 中的 Inception 模块中很有用,我们接着往下看。
Inception 模块
通常在构建卷积结构时,我们需要考虑是使用 1x1 卷积、3x3 卷积还是 5x5 卷积及其是否需要添加池化操作。而 GoogLeNet 的 Inception 模块就是帮你决定采用什么样的卷积结构。简单而言,Inception 模块就是分别采用了 1x1 卷积、3x3 卷积和 5x5 卷积构建了一个卷积组合然后输出也是一个卷积组合后的输出。如下图所示:
Inception 模块有两种形式,一种是原始模块,另一种是带有维度削减的模块。其结构如下图所示:
构建好 Inception 模块后,将多个类似结构的Inception模块组合起来便是一个Inception 网络,类似下图:
一个完整的 Inception 网络结构如下所示:
以上便是 Inception 网络的基本构造。这是当年获得冠军的 Inception V1 版本,可以看到模型层数很深了,网络更深提取各种层级的特征更加充分。除此之外,Inception V1 在最后两个全连接层中采取了一个全局平均池化层来代替全连接层。因为全连接层的参数数量庞大,通常是导致过拟合的直接原因,这里用全局平均池化来代替,可以很大程度上缓解过拟合的情况。完整的 Inception V1 的结构信息如下表所示:
至于 Inception V1 的效果,当然是收割各种冠军和头名啦。
Inception V1 之后,又在其基础上出现了 V2 V3 和 V4 版本以及 Xception,总之以 Inception 网络为主体的 GoogLeNet 不断优化和改进,称为深度卷积网络的一大重要分支。至于如何使用 Tensorflow 实现 Inception V1网络,GitHub 上有众多开源,笔者就不在此写了。
原文发布时间为:2018-10-16
本文作者:louwill
本文来自云栖社区合作伙伴“Python爱好者社区”,了解相关信息可以关注“Python爱好者社区”。