聊一聊GoogLeNet

聊一聊GoogLeNet

  • GoogLeNet简介
    • 网络亮点
    • 提出背景
    • Inception结构
    • 维度计算
    • 辅助分类器(Auxiliary Classifier)

GoogLeNet简介

GoogLeNet是由Google团队在2014年提出的神经网络,该网络斩获当年ImageNet竞赛中分类任务第一名。

网络亮点

Ø 引入了Inception结构(融合不同尺度的特征信息)
Ø 使用1x1的卷积核进行降维以及映射处理
Ø 添加两个辅助分类器帮助训练
Ø 丢弃全连接层,使用平均池化层(大大减少模型 参数)

提出背景

一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,但是这样会带来一些缺陷:

·参数太多,容易过拟合
·网络越大计算复杂度越大,难以应用
·网络越深,梯度越往后越容易消失

于是GoogLeNet针对这些问题给出了两个解决方案:

·深度方面:层数更深,文章采用了22层,为了避免上述提到的梯度消失问题,GoogLeNet巧妙的在不同深度处增加了两个loss来保证梯度回传消失的现象。(构造了两个辅助分类器)

·宽度方面:采用了Inception结构,这是一种网中网(Network In Network)的结构,即原来的结点也是一个网络。

Inception结构

下图是一个最原始的Inception结构:
聊一聊GoogLeNet_第1张图片
由上图可以看出,为了增加网络的宽度,引入了4个通道。

使用不同size的卷积核的目的
·采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;

·之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了;

但是,使用3x3,5x5的卷积核参数大小仍然过于巨大

·为此为了降维改进如下:
聊一聊GoogLeNet_第2张图片

1x1卷积层

对特征降维,一方面可以解决计算瓶颈,同时限制网络的参数大小,可以将网络做的更宽和更深。
至于它如何做到降维,我后面会讲到。

维度计算

下图是原论文中所给出的一系列层结构以及对应的输出维度,参数等。
比如patch size/stride代表卷积核大小以及步长大小,outputsize代表输出矩阵的大小,depth代表深度。
如果大家有兴趣可以看原论文Going deeper with convolutions
聊一聊GoogLeNet_第3张图片
注:#3×3 reduce,#5x5 reduce等表示在这之前使用了1×1的卷积核降维之后输出宽度。
其中Inception结构中我用下图标注出来
聊一聊GoogLeNet_第4张图片

·第一层 convolution层
输入(data):224×224×3
卷积核size:7×7,步长(stride)为 2,padding为 3
输出维度:112×112×64,计算方式:(224 + 2×3 − 7) / 2 + 1 = 112 ,kernel size = 64

·第二层 max pool层
输入维度:112×112×64
pooling size:3×3,步长(stride)为 2,padding为 1
输出维度:56×56×64,计算方式:(112 + 2×1 − 3 ) / 2 +1= 56

·第三层 convolution层
输入维度:56x56x64
卷积核size:3x3, 步长(stride)为1,padding为1
输出维度:56x56x192,计算方式:(56 + 2x1 - 3 )/ 1 + 1 = 56,kernel size = 192

·第四层 max pool层
输入维度:56x56x192
pooling size: 3x3, 步长(stride)为2,padding为1
输出维度:28x28x192,计算方式:(56 + 2x1 - 3 )/ 2 + 1 = 28

·第五层 Inception层
分为4条通道,每条通道的输入均为第四层的输出(28 x 28 x 192):

通道1:1×1 卷积层,64个卷积核,输出大小为 28×28×64;

通道2:1×1 卷积层,96个卷积核,输出大小为 28×28×96;作为输入进入 3×3 卷积层,输出大小为 28×28×128;

通道3:1×1 卷积层,32个卷积核,输出大小为 28×28×32;作为输入进入 5×5 卷积层,输出大小为 28×28×32;

通道4:3×3 的 pooling 层,输出大小为28×28×192;作为输入进入 1x1卷积层,输出大小为28×28×32;

Inception层的输出为这四个通道的输出和:64 + 128 + 32 + 32 = 256

当然,真实的网络中用到了不止一个Inception结构,我们可以看一下它的网络体系结构,如下图所示:
聊一聊GoogLeNet_第5张图片
我们可以看到,该网络用到了好几个Incepton结构,但大体都是一样的。

细心的小伙伴可能会看到,该体系结构还有两处不一样的地方,没错 那个就是辅助分类器。后面我会讲到辅助分类器。

如何降维,以第五层第二个通道为例:
·如果没有那个 1×1卷积层,参数个数为 3×3×192×128=221,184 个;
·如果加了一个 1×1卷积层,参数个数为 1×1×192×96+3×3×96×128=129,024 个;

辅助分类器(Auxiliary Classifier)

聊一聊GoogLeNet_第6张图片
从上图我们可以看到辅助分类器首先经过一个平均池化下采样,然后一个卷积层,两个全连接层,最后通过softmax函数输出分类结果。

以上就是我个人对GoogleNet的了解,还有很多的不足,希望通过自己的总结让自己加深印象,也希望能帮助更多的人去了解神经网络,加油!

你可能感兴趣的:(深度学习,卷积,神经网络)