下图给出了网络的层次结构和参数,其中:
- type 列:给出了每个模块/层的类型。
- patch size/stride 列:给出了卷积层/池化层的尺寸和步长。
- output size 列:给出了每个模块/层的输出尺寸和输出通道数。
- depth列:给出了每个模块/层包含的、含有训练参数层的数量。
- #1x1列:给出了每个模块/层包含的1x1 卷积核的数量,它就是1x1 卷积核的输出通道数。
- #3x3 reduce列:给出了每个模块/层包含的、放置在3x3 卷积层之前的1x1 卷积核的数量,它就是1x1 卷积核的输出通道数。
- #3x3列:给出了每个模块/层包含的3x3 卷积核的数量,它就是3x3 卷积核的输出通道数。
- #5x5 reduce列:给出了每个模块/层包含的、放置在5x5 卷积层之前的1x1 卷积核的数量,它就是1x1 卷积核的输出通道数。
- #5x5列:给出了每个模块/层包含的5x5 卷积核的数量,它就是5x5卷积核的输出通道数。
- pool proj列:给出了每个模块/层包含的、放置在池化层之后的1x1 卷积核的数量,它就是1x1 卷积核的输出通道数。
- params列:给出了每个模块/层的参数数量。
- ops列:给出了每个模块/层的计算量。
Inception V1 的参数数量为 697.7 万,其参数数量远远小于AlexNet(6千万)、VGG-Net(超过1亿)。
Inception V1 参数数量能缩减的一个主要技巧是:在inception(5b)输出到linear之间插入一个平均池化层avg pool。
- 如果没有平均池化层,则inception(5b) 到 linear 之间的参数数量为:7x7x1024x1024,约为 5 千万。
- 插入了平均池化层之后,inception(5b) 到 linear 之间的参数数量为:1x1x1024x1024,约为 1百万。
Inception 模块
- 原始的Inception 模块对输入同时执行:3个不同大小的卷积操作(1x1、3x3、5x5)、1个最大池化操作(3x3 )。所有操作的输出都在深度方向拼接起来,向后一级传递。
- 三种不同大小卷积:通过不同尺寸的卷积核抓取不同大小的对象的特征。
- 使用1x1、3x3、5x5 这些具体尺寸仅仅是为了便利性,事实上也可以使用更多的、其它尺寸的滤波器。
- 1个最大池化:提取图像的原始特征(不经过过滤器)。
原始Inception 模块中,模块的输出通道数量为四个子层的输出通道数的叠加。这种叠加不可避免的使得Inception 模块的输出通道数增加,这就增加了Inception 模块中每个卷积的计算量。因此在经过若干个模块之后,计算量会爆炸性增长。
解决方案是:在3x3 和 5x5 卷积层之前额外添加1x1 卷积层,来限制输入给卷积层的输入通道的数量。
注意:
- 1x1 卷积是在最大池化层之后,而不是之前。这是因为:池化层是为了提取图像的原始特征,一旦它接在1x1 卷积之后就失去了最初的本意。
- 1x1 卷积在3x3、5x5 卷积之前。这是因为:如果1x1 卷积在它们之后,则3x3 卷积、5x5 卷积的输入通道数太大,导致计算量仍然巨大。
辅助分类器
- 为了缓解梯度消失的问题,InceptionNet V1 给出了两个辅助分类器。这两个辅助分类器被添加到网络的中间层,它们和主分类器共享同一套训练数据及其标记。其中:
- 第一个辅助分类器位于Inception(4a) 之后,Inception(4a) 模块的输出作为它的输入。
- 第二个辅助分类器位于Inception(4d) 之后,Inception(4d) 模块的输出作为它的输入。
- 两个辅助分类器的结构相同,包括以下组件:
- 一个尺寸为5x5、步长为3的平均池化层。
- 一个尺寸为1x1、输出通道数为128 的卷积层。
- 一个具有1024 个单元的全连接层。
- 一个drop rate = 70%的 dropout 层。
- 一个使用softmax 损失的线性层作为输出层。
- 在训练期间,两个辅助分类器的损失函数的权重是0.3,它们的损失被叠加到网络的整体损失上。在推断期间,这两个辅助网络被丢弃。
- 在Inception v3 的实验中表明:辅助网络的影响相对较小,只需要其中一个就能够取得同样的效果。
- 事实上辅助分类器在训练早期并没有多少贡献。只有在训练接近结束,辅助分支网络开始发挥作用,获得超出无辅助分类器网络的结果。
- 两个辅助分类器的作用:提供正则化的同时,克服了梯度消失问题。