1. GoogLeNet
1.1 概述
1.一般来说提升网络性能最直接的方案是增加网络的深度(层次)和宽度(神经元数量),但这会存在以下一些问题:
a. 参数太多,但训练数据集有限,容易产生过拟合;
b. 网络越大,参数越多,计算复杂度增大,难以应用;
c. 网络越深,容易产生梯度弥散(即梯度逐步消失),无法优化;
- 理论上减少参数一个办法就是采用稀疏策略即用部分连接代替全连接,但在实际上由于硬件优化的问题,稀疏连接并无法形成优化,计算时间可能差不多;
- 所以大量文献采用将稀疏矩阵聚类成一些密集的子矩阵,GoogLeNet就是在此基础上提出了Inception,分为v1\v2\v3\v4等多个版本
1.2 Inception v1
- inception v1对于每一层同时做了多种操作的聚合
1.2 GoogLeNet的网络结构
第0层(输入):
- 原始图像输入为224x224x3
- 图像做零均值化操作,即每个像素减去均值
第1层(卷积层):
- 使用64个7x7的卷积核, 滑动步长为2, padding为3 =》输出为 112x112x64;
- 卷积后进行relu操作
- 之后进行3x3的池化(步长为2)操作 => 输出为56x56*56
- 池化操作后进行relu操作
第二层(卷积层):
- 使用192个3x3卷积核,滑动步长为1, padding为1 =》输出为56x56x192
- 卷积后进行relu操作
- 之后进行3x3的池化(步长为2)操作 =》 输出为28x28x192
- 池化操作后进行relu操作
第三层(Inception 3a层):
- 四个分支同时操作,即所谓的Inception算法
分支1: 采用64个1x1卷积核,步长为1,并进行relu => 输出28x28x64
分支2:
2.1 (降维)采用96个1x1卷积核,步长为1,并进行relue => 输出28x28x96
2.2 采用128个3x3卷积核,步长为1 => 输出为28x28x128
分支3:
3.1 (降维)采用16个5x5卷积核,步长为1,并进行relu => 输出28x28x16
3.2 采用32个5x5卷积核,步长为2 => 输出为28x28x32
分支4:
4.1 用3x3步长为1进行池化操作 => 输出28x28x192
4.2 用32个1x1的卷积核进行卷积操作,=> 输出28x28x32
- 并联上述四组操作,其实就是拼接第三维,输出为 28 x 28 x (64 + 128 + 32 + 32) = 28 x 28 x 256
第四层(Inception 3b层):
第五层(Inception 4a层):
第六层(Inception 4b层):
第七层(Inception 4c层):
第八层(Inception 4d层):
第九层(Inception 4e层):
第十层(Inception 5a层):
第十一层(Inception 5b层):
第十二/三层(平均池化 + softmax):