Please enable JavaScript.
Coggle requires JavaScript to display documents.
Inception(2014-) (GoogLeNet (问题描述 (解决方法 (“减小”深度 (优点 比较不同深度下的loss和准确率
…
Inception(2014-)
GoogLeNet
论文
Going deeper with convolutions
特点
- 包括Inception模块的所有卷积,都用了修正线性单元(ReLU)
- 为了避免上述提到的梯度消失问题,GoogLeNet巧妙的在不同深度处增加了两个loss来保证梯度回传消失的现象
- 保持低层为传统卷积方式不变,只在较高的层开始用Inception模块,这样层数就不会因为堆叠过多而爆炸
问题描述
原因
获得高质量模型最保险的做法就是增加模型的深度(层数)或者是其宽度(层核或者神经元数)
导致的问题
- 在训练数据集有限的情况下,参数太多,容易过拟合
- 网络越大计算复杂度越大,难以应用
- 网络越深,梯度越往后穿越容易消失,难以优化模型
解决方法
“减小”深度
优点
- 比较不同深度下的loss和准确率
- 较低层次的loss传到底层时梯度衰减的不多
概述
为了避免上述提到的梯度消失问题,GoogLeNet巧妙的在不同深度处增加了两个loss来保证梯度回传消失的现象(后面觉得这样是不对的)
引入Inception V1 Module
主要思想
找出如何让已有的稠密组件接近与覆盖卷积视觉网络中的最佳局部稀疏结构
作用
覆盖卷积视觉网络中特征
问题
无法判断,或者不好判断应该用3*3、5*5还是池化层
- 解决方法:不知道用那种filer,那就全都用,让后面的层学习用哪种
- 原理:把学习到的东西都堆叠在一起,然后让后面的层学习哪些特征有用
无法学习不同channel之间的特征
- 解决方法:加入1*1filter
- 原理:详看Network in Network
结构
- 1*1捕捉1*1范围内的特征
- 3*3捕捉3*3范围内的特征
- 5*5捕捉5*5范围内的特征
- 把3个最合适的特征提取拼接在一起
更高效的下采样方案
描述
深度CNN网络中一般会不断使用Pool层来减少feature maps size。这必然意味着传递信息的不断丢失。一般为了减少信息的过度丢失,在加入Pool层减少feature maps size的同时都会同比例扩大它的channels数目
问题
- 先将channels数目扩大(一般使用1x1 conv),然后再使用pool层来减少feature map size,不过其中1x1 conv的计算显然会有非常大的计算开销
- 先做Pooling减少feature map size,然后再使用1x1 conv对其channels数目放大,不过显然首先使用Pooling的话会造成信息硬性丢失的不可避免,在此之后再使用1x1 conv去增加channels数目的做法已经有些亡羊补牢之嫌了
方法
pooling层添加一个额外的并行pooling路径用于提高效率
较少卷积后的channel数
问题
- 每一层 Inception module 的 filters 参数量为所有分支上的总数和,多层 Inception 最终将导致 model 的参数数量庞大,对计算资源有更大的依赖
- pooling单元加入之后输出滤波器的数量等于前一步中滤波器的数量,pooling层的输出和卷积层的输出融合会导致输出数量逐步增长
- 卷积层顶端由于滤波器太多让计算开销过分昂贵
解决办法
- module中的卷积和池化后加入1*1的卷积,相当于对核这维度进行全连接
- 保持低层为传统卷积方式不变,只在较高的层开始用Inception模块,这样层数就不会因为堆叠过多而爆炸
原理
1x1卷积层和3x3、5x5组合
- 维度压缩:
由1x1卷积核个数控制输出channel,池化层只能改变长和宽的纬度
- 为什么加上之后参数减少又不失真,没说,但感觉和深度神经网络和广度神经网络的关系差不多吧
1x1卷积层和最大池化层
- 因为最后需要拼接在一起,所以channel数必须一样
- 增加非线性:保持与原维度相同的1×1的卷积核个数
优点
- 允许显著增加每一步的单元数目,计算复杂性不会不受控制。降维的普遍使用能保护最后一步到下一层的大量输入滤波器
- 视觉信息在不同的尺度上进行处理然后聚合,这样下一步可以同时从不同尺度提取特征
Inception v2/v3(2015)
论文
Rethinking the Inception Architecture for Computer Vision
特点
CNN模型设计通用规则
慎用bottleneck
描述
- 如果出于模型分类精度考虑,那么应尽量避免使用bottleneck模块,尤其是不应当在模型的早期阶段使用
- bottle是出于计算与存储节省
原因
作者们认为CNN模型本质上是一个DAG(有向无环图),其上信息自底向上流动,而每一个bottleneck的使用都会损失一部分信息
做法
- 一定要下手轻些(不要一下子使用1x1 conv缩减过多的feature maps的channels数目)
- 如果一定要用reduction模块也要在模型较靠后的几层使用
层宽些还是有好处的
-
原因
多些参数就可使得每层获得多些的表达能力,可使得模型收敛得更快
更深的较底层(size亦小)可以使劲压
描述
对于网络后面的feature maps可以使用像bottleneck那样的模块对其进行channels数目缩减
原因
后期较小size的feature maps之上的相邻units(即channels)之间具有更加的关联性(即冗余信息不少),因此可以折腾的厉害些(使输出的channels变少)而不担心信息丢失(反而信息被梳理的更清晰、有效)
平衡网络的深度与宽度
描述
一个成功的CNN网络设计一定要将深度与宽度同时增加,瘦高或矮胖的CNN网络都不如一个身材匀称的网络的效果好
稀疏的Inception模块
大kernel分解为多个小kernel的叠加
描述
一个表达力强的复杂网络可以由较简单的小网络来组成,将一个大的卷积核分解成多个小卷积核的叠加
原因
- 详细看Network in Network
- 有效的节约开销((3*3+3+3*3 +3)/(5*5+5)=80%)
-
对称的conv计算分解为非对称的conv计算
描述
nxn的卷积核替换为两个分别为1xn与nx1的卷积核
原因
- 详细看Network in Network
- 有效的节约开销
-
增加分类层的作用分析
描述
在extra loss的层加入BN(置信网络)或dropout
-
-