【BasicNet系列:一】GoogLeNet 系列v1 v2 v3 Xception v4
GoogLeNet
-
1、GoogLeNet 解决了什么问题
-
- Inception 结构引出缘由
-
2、⭐Inception v1
-
- native version
- Improved version
- Auxiliary classifiers(AC)
-
3、GoogLeNet
-
0、General Design Principles
-
4、Inception v2
-
- ⭐ Batch Normalization
-
5、Inception v3
-
- Asymmetric Convolutions
- new pooling layer
- Label smooth
-
6、Xception
-
- ❤问题 relu
- ⭐"depthwise separable convolution"
-
7、Inception v4
ILSVRC14 比赛 冠军
参考:
深度学习—GoogLeNet
- GoogLeNet(Inception-v1):相较于AlexNet和VGG网络,在其基础上增加了多条支路以提高模型的计算效率
- Inception-v2:通过引入批归一化技术实现了对训练数据分布的适应性增强;同时将5×5的空间可分离卷积替换为两个连续的3×3空间可分离卷积
- Inception-v3:采用了非对称卷积策略并结合新的池化方法以及加入了Label smoothing技术以提升分类效果
- Inception-v4:基于上述研究在此基础上进一步优化网络结构并引入了更加高效的运算机制
1、GoogLeNet 解决了什么问题
- 提高了计算资源的使用效率
- 采用Hebbian原则并结合多尺度处理进行性能优化
- 在深度和宽度两个维度上进行扩展,从而显著增强深度卷 convolutional neural network(DCN)的能力
Inception 结构引出缘由
CNN结构演化图

在GoogLeNet之前,主流网络结构的重大突破主要体现在网络深度增加(即层数增多)和宽度增加(即神经元数量提升)。这不仅提升了模型的表现能力。
主流缺点:
- 参数过多可能导致模型过拟合问题,在训练数据集规模受限的情况下尤为明显;
- 深度增大会导致系统计算复杂度显著提升,在实际部署中往往难以承受更高的计算开销;
- 深度增大不仅增加了系统计算负担, 更可能导致优化困难, 因为深层神经网络中的梯度在传递过程中可能出现"梯度弥散"现象
解决方法:在一定程度上增加网络深度与宽度的同时降低模型复杂度,在不牺牲网络结构的关键特性(如稀疏性)的前提下(既能保持网络结构的稀疏性),从而能够充分利用密集矩阵所具有的高效计算优势(——GoogLeNet)
2、⭐Inception v1
2014
Going deeper with convolutions
主要思路: 怎样用密集成分来近似最优的局部稀疏结构。
现有技术中提升网络精度的主要途径:通过增加网络架构的复杂度(大量参数可能导致模型过拟合,并且显著提升运算开销)或者通过收集更多高质量的数据来辅助训练。
贡献:
- 利用1x1的卷积解决维度爆炸
native version

在pooling层添加一个额外的并行pooling路径用于提高效率。

(channel数等红蓝字仅为示例)
- 使用不同尺寸的卷积核对应着不同尺寸的感受野;最后将特征拼接相当于融合了不同尺度的信息;
- 选择1×1、3×3及5×5的卷积核是为了便于对齐边缘信息;设定stride=1后分别设为pad=0、1、2可以让各卷积后的特征保持一致维度;
- 研究表明池化操作非常有效;因此Inception网络中集成池化模块;
- 随着网络深度增加其抽象程度不断提高同时各特征所覆盖的感受野范围也在不断扩大;
在应用5×5尺寸的卷积核时,仍会面临显著的计算开销。该文章参考了NIN2(Network in Network)架构,并通过引入1×1尺寸的卷积层来实现降维操作。
Improved version

图 :Filter Concatenation 是channel级别的操作(channel数为示例)
def __init__(self, in_planes, n1x1, n3x3red, n3x3, n5x5red, n5x5, pool_planes):
super(Inception, self).__init__()
# 1x1 conv branch
self.b1 = nn.Sequential(
nn.Conv2d(in_planes, n1x1, kernel_size=1),
nn.BatchNorm2d(n1x1),
nn.ReLU(True),
)
# 1x1 conv -> 3x3 conv branch
self.b2 = nn.Sequential(
nn.Conv2d(in_planes, n3x3red, kernel_size=1),
nn.BatchNorm2d(n3x3red),
nn.ReLU(True),
nn.Conv2d(n3x3red, n3x3, kernel_size=3, padding=1),
nn.BatchNorm2d(n3x3),
nn.ReLU(True),
)
# 1x1 conv -> 5x5 conv branch
self.b3 = nn.Sequential(
nn.Conv2d(in_planes, n5x5red, kernel_size=1),
nn.BatchNorm2d(n5x5red),
nn.ReLU(True),
nn.Conv2d(n5x5red, n5x5, kernel_size=3, padding=1),
nn.BatchNorm2d(n5x5),
nn.ReLU(True),
nn.Conv2d(n5x5, n5x5, kernel_size=3, padding=1),
nn.BatchNorm2d(n5x5),
nn.ReLU(True),
)
# 3x3 pool -> 1x1 conv branch
self.b4 = nn.Sequential(
nn.MaxPool2d(3, stride=1, padding=1),
nn.Conv2d(in_planes, pool_planes, kernel_size=1),
nn.BatchNorm2d(pool_planes),
nn.ReLU(True),
)
f1 = self.branch1x1(x)
f2 = self.branch3x3(x)
f3 = self.branch5x5(x)
f4 = self.branch_pool(x)
output = torch.cat((f1, f2, f3, f4), dim=1) #f1=[1,64,23,23] 64为通道数,so dim=1
torch.cat(tensors, dim=0, out=None) → Tensor
Joins a series of tensor objects along a specific dimension. Each tensor must conform to having identical shapes, except possibly in the joined dimension, and none should be nonempty.
在3×3和5×5的输入之前分别接有1×1的卷积核以降低特征图厚度(即通道数量)。
在技术层面的做法是,在较低层级采用传统卷积方式,并且从较高的层级引入Inception模块。
Auxiliary classifiers(AC)

和ResNet不同:
- ResNet通过搭建浅层结构提取特征,并将这些特征成功迁移至更深的结构中*
3、GoogLeNet
主要想法: 通过设计密集块布局来模拟最优化稀疏模式,在提升性能水平的同时确保计算资源消耗保持可控。
1、提出inception architecture并对其优化
- 利用1x1的卷积解决维度爆炸
2、取消全连层
3、运用auxiliary classifiers加速网络converge
GoogLeNet 可以看作是很多个 inception 模块的串联

- 该网络采用模块化设计以便于增删组件;
- 网络在最后部分采用平均池化替代全连接层源自NIN架构,在实验数据显示该方法提高了约0.6%的准确率。然而尽管如此,在最终阶段仍保留了一个全连接层以便于后续微调过程;
- 移除全连接层后仍保留了Dropout技术;
- 避免梯度消失问题 额外添加两个辅助softmax单元用于传递梯度 研究者建议对这些辅助分类器施加衰减系数以平衡性能提升与计算开销 实际测试发现这些额外单元在运行时不起作用
大量的辅助工作:
- 包括训练多个model求平均、裁剪不同尺度的图像做多次验证等
0、General Design Principles
已经被证明有效的用于放大网络的通用准则和优化方法:
防止信息过载,并特别关注网络前方区域时会遇到的问题。
数据信息向前传播过程无法通过高压缩率处理层。
在从input到output的过程中,在卷积神经网络中,在从input到output的过程中
另外输出的维度channel通常情况下会逐渐增多(即每层的num_output),如果不增加的话会导致网络难以训练。(特征维度不代表信息量多少,并且仅作为一种评估手段)
高维特征更易处理。 高维特征更易区分,会加快训练。
可以在低维嵌入空间中实现数据的融合具有良好的效果。例如,在执行3×3卷积操作之前对输入数据进行降维处理能够有效避免性能损失。假设我们能够有效地将数据压缩至紧凑形式,则模型训练过程的时间开销会相应减少。
平衡网络的宽度与深度。
4、Inception v2
v1 基础上改进:
改写说明
⭐ Batch Normalization
解决问题:“Internal Covariate Shift”
在每次训练过程中参数会发生变化;当给定同一网络的输入时, 尽管前一层(即n-1层)的输出会有所不同, 则会导致当前层(即第n层)的输入也会发生变化。
通过VGG网络架构,在inception模块中采用两个并行的3×3卷积层来代替传统的5×5卷积操作;这种替代方式既减少了参数规模的同时又提升了计算效率;随后对每个3×3卷积操作施加非线性激活函数处理能够进一步增强模型性能表现
大尺寸的卷积核能够扩大感受野范围;然而其带来的计算开销较大;具体而言;5×5大小的卷积核所包含的参数数量是相对应的3×3卷积核的大约2.78倍

在当前情况下,采用3×3的尺寸已经是相对较小的状态;然而,在这种情况下,进一步缩小到2×2可能会带来一些问题。尽管如此,在这种情况下,参数数量进一步减少的空间已经有限;相比之下,在效果上而言,则不如采用Asymmetric方式(V3)的效果更为显著;
- 以1×3和3×1两种结构取代传统的3×3卷积核。
该结构在初期阶段表现不够理想,在特征图尺寸介于12至20时表现出较好的效果。
(对于mxm维度的特征图而言,建议设置其尺寸范围为12至20)


对比

在GoogLeNet V₁架构中采用的Inception模块;为了提升效率,在V₂版本中采用了₃×₃尺寸的小规模 convolution序列来替代单一大尺度convolution;而在V₃设计中,则通过使用n×₁大小的小规模convolution来取代单一大尺度convolution(其中当n=7时的特征图尺寸为17×17)。
5、Inception v3
2015 年 v3: Rethinking the Inception Architecture for Computer Vision (https://arxiv.org/abs/1512.00567)
改进:
- 该方法通过将7×7的卷积核分解为两个一维卷积(1×7和7×1)来实现对三维特征图的空间再利用。
- 通过优化版本v1中的辅助分类器来提升模型性能。
- 引入一个新的池化层。
- 应用标签平滑化技术。
优势:
- 不仅能够加速算力(富余的算力可用于增强网络深度)
- 还可以将一个卷积层分割为两个独立的卷积层,并由此提升整个网络架构的深度与非线性
Asymmetric Convolutions
非对称卷积
- Filter分解: n × n = n×1 后再进行 1×n
- 能降低运算量
- 图片大小12 12~20 20之间用
优化auxiliary classifiers

new pooling layer
在池化之前,在Inception之后插入了一种防止信息丢失的结构(右侧图),然而这增加了计算开销。
该池化层通过两个并行模块实现尺寸缩减。其中分别为卷积操作和池化操作

Label smooth
one_hot_labels稍微的平滑了一点,减弱过拟合。
6、Xception
Xception: DeepLearning with Depthwise Separable Convolutions
设计目的 * Inception的主要目标是针对分类任务优化模型精度,并且由于其复杂的结构设计导致计算资源消耗较高;
- Xception的主要目标是设计出易于迁移的模型,在保证计算效率的同时能够适应多种不同的应用任务,并且能够实现较高的分类精度。
创新点
参考未被采用的深度可分离卷积设计并对其性能进行优化以提升Inception V3模型的效果(在设计时需明确区分通道卷积与空间卷积以确保网络的有效性)。
和原版的 Depth-wise convolution 区别
- 原版深度可分离卷(Depth-wise convolution),它通过先执行每个通道的3\times 3卷积操作后再应用一次1\times 1的点态卷(point-wise)操作来减少计算量;而Xception则相反地采用另一种顺序:首先运用1\times 1卷(point-wise)操作以激活信息随后在每个通道上执行深度可分离卷(depth-wise)操作以进一步提取特征信息.*
❤问题 relu
Depth-wise convolution层中的两个卷积操作之间是没有直接连接的,在这种结构中通常不会引入激活函数连接层;相反地,在Xception网络架构中,在执行完1×1尺寸的卷积操作后会紧接着接入一个ReLU类型的非线性激活单元;那么这个描述对吗?具体原因是什么呢?
模型结构
⭐"depthwise separable convolution"
通道分离式卷积

依据depthwise separable convolution的思想,进一步改造到下图。

- 输入:112×112×64
- 先进入1×1卷积,每个卷积核大小为1×1×64,这样每一小步卷积其实相当于只在深度上(×64的深度)进行。
- 假设1×1卷积的输出为112×112×7,我们把它分为7份,即每份是112×112×1
- 每份后面单独接一个3×3的卷积,此时每个卷积核为3×3×1,,这样每一小步卷积其实相当于只在面上(3×3的面)进行。
- 最后,把这7个3×3的卷积的输出叠在一起就可以了。
- 精度上略低于Inception-v3,但计算量和迁移性更好
- 卷积操作
卷积的操作,主要进行2种变换,
(1) spatial dimensions,空间变换
(2) channel dimension,通道变换
Xception就是在这2个变换上做文章。
- Xception 结构图
共计 36 层分为 Entry flow 8 个 conv;Middle flow 3*8 =24 个 conv;Exit flow 4 个 conv。


7、Inception v4
Year: 2016
"v4 version of Inception-v4, Inception-ResNet, and the impact of residual connections on learning" [https://arxiv.org/abs/1602.07261]
改进:
- Inception模块与ResNet结合
- Inception unit替代ResNet中的捷径连接部分

