Google Inception Net网络解析和代码实现
Google Inception Net采用了特殊的Inception Module构建网络,网络模型比VGG复杂,网络层数更深,但参数量比VGG少,性能也更好,在ILSVRC 2014的比赛中以较大优势获得了第一名,同年提出的VGG Net获得了第二名。从2014年网络被第一次提出到2016年,Inception共经历了四次改进和升级,并分别衍生了Inception V1-V4的版本。在几次改进迭代中,V3版本最能体现Inception网络的核心内容和技术创新,包括module的结构和各种trick,本文主要对Inception V3分别从网络结构、代码实现和技术亮点等几个方面进行解析。
1 Inception Module
Inception中除了普通的卷积和池化操作外,还包含多个模块组,每个模块组中包含多个Inception Module(结构如图所示),Module在base net的基础上,分为4个分支(branch),通过设定好的卷积核(常用1x1卷积和3x3卷积)和池化,保持feature map的空间尺寸不变,通道数增加,对输入数据进行特征提取,在每个module结尾再将几个branch输出的feature map进行通道维度的拼接。对相同的base net使用不同的卷积和池化操作,增加了网络对不同尺度feature map的适应性,module结构也可以让网络的深度和宽度高效率的扩充,增强模型提取特征的能力,提升准确率。
Inception Module一般有4个分支:
- 分支1:一般是1x1卷积,进行简单特征抽象
- 分支2:一般是1x1卷积后在接分解的1xn和nx1卷积(factorized,后面解释),进行较复杂特征抽象
- 分支3:一般和分支2类似,但深度更深,进行较复杂特征抽象
- 分支4:一般是最大池化或平均池化
通过4种不同程度的特征抽象和变换,选择性保留不同层的高阶特征,最大程度丰富网络的表达能力
2 网络结构
操作 | kernel尺寸/步长 | 输出尺寸 |
---|---|---|
卷积 | 3x3 / 2 | 149x149x32 |
卷积 | 3x3 / 1 | 147x147x32 |
卷积 | 3x3 / 1 | 147x147x64 |
最大池化 | 3x3 / 2 | 73x73x64 |
卷积 | 3x3 / 1 | 73x73x80 |
卷积 | 3x3 / 2 | 71x71x192 |
最大池化 | 3x3 / 1 | 35x35x192 |
Inception模块组 | 3个Inception Module | 35x35x228 |
Inception模块组 | 5个Inception Module | 17x17x768 |
Inception模块组 | 3个Inception Module | 8x8x1280 |
平均池化 | 8x8 | 8x8x2048 |
线性 | logits | 1x1x2048 |
softmax | 分类输出 | 1x1x1000 |
网络首先使用5个卷积层和2个最大池化层交替的普通结构,然后接上3个Inception模块组,每个模块组包含数量不等的Inception Module,最后再采用平均池化,将feature map的维度浓缩到只