GoogLeNet Inception v1,v2,v3,v4 演变

GoogLeNet Inception v1,v2,v3,v4 演变

1. 前言


This name is an homage to Yann LeCuns pioneering LeNet-5 network.

GoogLeNet v1 里面说为了致敬 LeNet 才取的这个名,假装这是真的。

关于 GoogLeNet v1-v4 ,网上已经有太多的学习总结,本文只是记录一下我个人 get 到的点。GoogLeNet 最大的贡献就是 inception,在 CNN 的发展过程中算一个突破。大概是在之前,多数的 CNN 研究者为了模型能获得更好的性能,就不断的叠加卷积层,让网络越来越 Deeper,这样能一定程度提升模型性能,但是这是最有效的方式?而且也不能一直叠加卷积层,会带来大量的计算,如果是应用的话就必须考虑硬件水平,同时也容易过拟合。这样的网络看起来廋长廋长的,GoogLeNet 似乎突破这样的惯性思维,让网络加深不一定要竖着长,也可以横着长 Wider,但不是越来越胖,是更丰富了。此外,像这种 v1-v4 不断连载的系列有没有很激动的感觉,唯一不爽的就是总是跟着他们屁股后面跑,多思考总没错。

每一次升级都是在前一个版本基础上的改进,如果跳过低版本,当然可以直接用 v4,只不过网络不一定适合你的数据。 最可取的办法是研究 Inception v1-v4 的演变过程,该思想有利于帮助我们构建自定义的 CNN 网络。

原文如下:

2. Inception v1


首先,在 Inception v1 之前,CNN 网络可能出现的问题。

问题

  • 在数据集中,对于某一类物体的图像,各图像中该物体的尺寸可能相差很大。简言之,就是各图像中物体占图片的面积相差很大。这时候为卷积层选择合适的 kernel size 变得相当重要,对于分布更广的信息,首选更大的 kernel,对于局部分布的信息,选择较小的 kernel,而在传统的 CNN 中,对于同一个 level 的 feature map,仅仅只是用了同样尺寸的 kernel。

  • 前面也提到过,对于非常 Deep 的网络,一个是在计算量上更 expensive,第二是容易过拟合

解决方案

  • 如下图,稚嫩版(naive)的 inception 模块,但是已经是有模有样的了,即实现了在同一个 level 的 feature map 上安排多种尺寸的 filter,网络本质是变得更 wider 而不是 deeper. 具体的尺寸是(1x1、3x3、5x5)。 此外,还执行了最大池化。 将这四条线路的输出 concatenate 起来然后输出。
GoogLeNet Inception v1,v2,v3,v4 演变
  • 上文所述,深度神经网络面临巨额的计算。 为了降低成本,如下图的 Inception 模块,作者在 3x3 和 5x5 卷积之前添加了 1x1 卷积来限制输入通道的数量,即实现了降维,具体可参考这篇博文 1x1卷积核的作用。 大大减少计算成本的同时,实现了更深的网络,引入更多的非线性特征
GoogLeNet Inception v1,v2,v3,v4 演变
  • 此外,看一下最终 v1 的网络结构,最开始的卷积层由橙色框中传统的连接构成,紧接着若干个 inception 模块,最后是一个全局平均池化。更细节的网络结构图,请参考 GoogLeNet Netscope。毫无疑问,这算一个比较 Deep 的网络了,可能出现的一个问题是梯度消失。为了防止网络中间部分的 “消失”,作者添加了两个辅助分类器(如两个紫色框)
GoogLeNet Inception v1,v2,v3,v4 演变

​ 最终 loss = 实际分类器 loss + 0.3×两个辅助分类器 loss

# The total loss during training
total_loss = real_loss + 0.3 * aux_loss_1 + 0.3 * aux_loss_2

3. Inception v2

  • 待补充

4. Inception v3

  • 待补充

5. Inception-ResNet v1,v2

  • 待补充

6. Inception v4

  • 待补充

7. 总结

  • 待补充

others**