GoogLeNet
ILSVRC14 比赛 冠军
参考:
深度学习—GoogLeNet
- GoogLeNet(Inception-v1):相比AlexNet和VGG,出现了多支路,引入了1×1卷积帮助减少网络计算量
- Inception-v2:引入Batch Normalization(BN);5×5卷积使用两个3×3卷积代替
- Inception-v3:非对称卷积(n×n卷积分割为1×n和n×1两个卷积); new pooling ; Label smooth
- Inception-v4:进一步优化,引入ResNet的shortcut思想
1、GoogLeNet 解决了什么问题
- 提升了计算资源的利用率
- 基于Hebbian法则和多尺度处理来 优化性能
- 从深度与宽度两方面增加尺寸,直接提升深度卷积网络性能
Inception 结构引出缘由
CNN结构演化图
GoogLeNet出来之前,主流的网络结构突破大致是网络更深(层数),网络更宽(神经元数)
主流缺点:
- 参数太多,容易过拟合,若训练数据集有限;
- 网络越大计算复杂度越大,难以应用;
- 网络越深,梯度越往后穿越容易消失(梯度弥散),难以优化模型
解决方法:增加网络深度和宽度的同时减少参数,既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。 ————GoogLeNet
2、⭐Inception v1
2014
Going deeper with convolutions
主要思路: 怎样用密集成分来近似最优的局部稀疏结构。
传统的提高网络精度的方法:扩大网络规模(巨量参数容易产生过拟合也会大大增加计算量) 或 增大训练数据集
贡献:
- 利用1x1的卷积解决维度爆炸
native version
在pooling层添加一个额外的并行pooling路径用于提高效率。
- 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;
- 之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了;
- 文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了。
- 网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加。
问题 : 使用5x5的卷积核仍然会带来巨大的计算量。 文章借鉴NIN2(Network in Network),采用1x1卷积核来进行降维。
Improved version
def __init__(self, in_planes, n1x1, n3x3red, n3x3, n5x5red, n5x5, pool_planes):
super(Inception, self).__init__()
# 1x1 conv branch
self.b1 = nn.Sequential(
nn.Con