VGG
核心:
- VGGNet全部使用3x3的卷积核和2x2的池化核,通过不断加深网络结构来提升性能。网络层数的增长并不会带来参数量上的爆炸,因为参数量主要集中在最后三个全连接层中。同时,两个33卷积层的串联相当于1个55的卷积层,3个3x3的卷积层串联相当于1个7x7的卷积层,即3个3x3卷积层的感受野大小相当于1个7x7的卷积层。但是3个3x3的卷积层参数量只有7*7的一半左右,同时前者可以有3个非线性操作,而后者只有1个非线性操作,这样使得前者对于特征的学习能力更强
- 使用1x1的卷积层来增加线性变换,输出的通道数量上并没有发生改变。这里提一下1x1卷积层的其他用法,1x1的卷积层常被用来提炼特征,即多通道的特征组合在一起,凝练成较大通道或者较小通道的输出(升维和降维?),而每张图片的大小不变。有时1x1的卷积神经网络还可以用来替代全连接层
优点:多个小卷积替代大的,增加的非线性层,且参数量减少。
GoogleNet(Inception V1)
核心:
- 引入了Inception结构(融合不同特征的尺度信息)
- 1x1卷积降维
- 丢弃全连接层,使用全局平均池化
- 添加两个辅助分类器(softmax层)帮助训练
全局平均池化:对于输出的每一个通道的特征图的所有像素计算一个平均值。优点:降维、减少网络参数、正则、
收敛速度减慢
为什么使用全局平均池化层
Inception V2(2015)
- 两个3x3卷积代替5x5卷积
- 使用BN算法,可以提高大网络的收敛速度
- 1n和n1这种非对称卷积来代替n*n的对称卷积
- 增加滤波器输出的模块,来产生高维的稀疏特征(看不懂,啥意思?)
非对称卷积:非对称卷积不要用在靠近输入的层,会影响精度,要用在较高的层,这种方法不是哪儿都适用的,非对称卷积在图片大小介于12×12到20×20大小之间的时候,效果比较好,具体原因未知。
非对称卷积(googlenet系列)
Inception V3(2015.12)
- 在v2的基础上使用RMSProp优化、Label Smoothing技巧、7×7卷积分解以及对auxiliary classifier(辅助分类)加入BN层正则
- 并行的降维结构(使用多个conv和polling一起降维)
并行降维:操作会造成表达瓶颈问题,也就是说特征图的大小不应该出现急剧的衰减(只经过一层就骤降 ) 。如果出现急剧缩减,将会丢失大量的信息,对模型的训练造成困难。所以使用多个conv+polling一起来降维。
作者讲了很多的分类网络
Inception V4(2016.02)
- Stem模块、Inception-A模块、Inception-B模块、Inception-C模块(这些模块是由之前的v1、v2、v3的trick设计的)
- 融合了Residual模块(v1,v2,v3的Inception module来替换resnet shortcut中的bootleneck)
Xception (2016.10)
- 通道分离式卷积(没有正式提出?只是一种思想?):模型参数有微量的减少,减少量很少:Inception V3是先做1x1的卷积,再做3x3的卷积,这样就先将通道进行了合并,即通道卷积,然后再进行空间卷积,而Xception则正好相反,先进行空间的3x3卷积,再进行通道的1x1卷积(也就是1x1卷积发挥了作用!!!-跨通道交互、聚合)
- RELU的有无
详解Inception结构:从Inception v1到Xception
[论文笔记] Inception V1-V4 系列以及 Xception
从Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet,MobileNetV2,ShuffleNetV2,MobileNetV3
ResNet(2016)
核心:
- 引入了两种残差结构,解决深层网络的退化问题
- 缓解了梯度消失
网络结构: - resnet残差结构:(3x3 conv +3x3conv)和(1x1conv降维 +3x3conv + 1x1conv 升维)
- 瓶颈层(resnet残差结构)纯是为了节省计算量,对最终的模型精度并无影响
- 因为有时残差结构需要匹配维度,所以还有一种残差结构(当步长不为1或者输入和输出通道数不一致时触发)
ResNeXt(2017)
提出原因:
传统的要提高模型的准确率,都是加深或加宽网络,但是随着超参数数量的增加(比如channels数,filter size等等),网络设计的难度和计算开销也会增加
核心;
1.ResNeXt结合了inception与resnet的优点
2.分组卷积(优势):参数量减少,分可以学习更多元的特征表示,此外分组的操作或许能起到网络正则化的作用。
SE Net(2017)、SE ResNet、 SE ResNeXt (2018)
核心:通道注意力SE模块、分组卷积
RegNetX和RegNetY
NAS(Neural Architecture Search)网络搜索技术非常火,但这对计算资源要求也比较高(都是大厂玩的东西)。包括这篇论文中的RegNet也有使用到NAS技术。但在论文中作者一再强调这篇论文与之前的一些NAS论文不同(例如MobileNetv3,EfficientNet),之前的一些有关NAS的论文都是在给定的设计空间(designed search space)中通过搜索算法去搜索出一组最佳参数组合。但在这篇论文中作者要探究的是如何去设计设计空间(design design spaces)并发现一些网络的通用设计准则(network design principles),而不是仅仅去搜索出一组参数.(即如何从一个给定的原始设计空间AnyNet一步步探索出最终的RegNet空间)
-
RegNetX的网络结构(stem+body+head)
- stem就是一个普通的卷积层(默认包含bn以及relu),卷积核大小为3x3,步距为2,卷积核个数为32.
- body就是由4个stage堆叠组成,如图(b)所示。每经过一个stage都会将输入特征矩阵的height和width缩减为原来的一半。而每个stage又是由一系列block堆叠组成,每个stage的第一个block中存在步距为2的组卷积(主分支上)和普通卷积(捷径分支上),剩下的block中的卷积步距都是1,和ResNet类似。
- head就是分类网络中常见的分类器,由一个全局平均池化层和全连接层构成。
-
RegNetY在block中的Group Conv后接了个SE(Squeeze-and-Excitation)模块(类似于EfficientNet吧)
ResNeSt(2020)
ResNeSt看上去像ResNeXt 和 SKNet 的结合体
从ResNet、DenseNet、ResNeXt、SE Net、SE ResNeXt 演进学习总结
ResNet家族:ResNet、ResNeXt、SE Net、SE ResNeXt(讲的很细)
DenseNet(2017)
核心;
建立了不同层之间的连接关系(每一层的输入来自前面所有层的输出),充分利用了feature,进一步减轻了梯度消失问题,加深网络不是问题,而且训练效果非常好。
利用bottleneck layer(1x1conv),Translation layer(倍率减少维度)以及较小的growth rate(固定输出特征图的个数-特征维度?)使得网络变窄,参数减少,有效抑制了过拟合,同时计算量也减少
1、减轻了vanishing-gradient(梯度消失)
2、加强了feature的传递
3、更有效地利用了feature
4、一定程度上较少了参数数量
MobileNet(2017)
核心:
- 将Xception中通道分离卷积的思想应用,提出深度可分离卷积
- 使用超参数a,b;a控制卷积核个数,b控制图像尺寸
- 网络是参照VGG修改的,所以没有残差结构,有人说MobileNet v1网络中的DW卷积很容易训练废掉,效果并没有那么理想
MobileNetv2(google 2018年)
- 与resnet的残差结构相比,提出了逆向的残差结构(Inverted residuals–
1*1conv
升维+3*3DW conv
+1*1conv
降维) - 提出了线性瓶颈单元(linear bottlenecks)(去掉残差结构最后一个relu6,因此称为线性单元)
- 并不是所有的倒残差结构都有shortcut连接(Add),只有当stride=1且输入特征矩阵与输出特征矩阵shape相同时才有shortcut连接(只有当shape相同时,两个矩阵才能做加法运算,当stride=1时并不能保证输入特征矩阵的channel与输出特征矩阵的channel相同)
为什么使用逆向残差:原文说高维信息通过ReLU激活函数后丢失的信息更少。减少参数,增强非线性表达能力(我觉得原本的残差结构参数更少吧)
为什么使用线性单元:防止非线性破坏太多信息
MobileNetv3(google 2019年)
MobileNetV3的网络基础模块,包括深度可分离卷积(depthwise separable convolutions),逆向残差模块(inverted residual structure),线性瓶颈模块(linear bottleneck),**挤压模块(Squeeze-And-Excite)**等都是借鉴的mobile v1,v2,SENet等网络结构。基于这些网络结构的基础组件,采用NAS(network architecture search)的方式,搜索得到MobileNetV3-Large 和MobileNetV3-Small这2个网络结构。
- 激活函数更新优化,v3在网络层比较靠后的位置(靠后的层维度高,计算量更大)使用h-swish激活函数(相对于swish激活函数计算量更少)。
MobileNet(v1、v2)网络详解与模型的搭建
轻量级网络模型之MobileNet系列
ShuffleNet(2017)
使用group convolution的网络有很多,如Xception,MobileNet,ResNeXt等。其中Xception和MobileNet采用了depthwise convolution,这是一种比较特殊的group convolution,此时分组数恰好等于通道数,意味着每个组只有一个特征图。但这些网络存在一个很大的弊端:采用了密集的1x1 pointwise convolution(计算量还是较大)
group convolution层另一个问题是不同组之间的特征图需要通信,否则就好像分了几个互不相干的路,大家各走各的,会降低网络的特征提取能力,这也可以解释为什么Xception,MobileNet等网络采用密集的1x1 pointwise convolution,因为要保证group convolution之后不同组的特征图之间的信息交流
- mobileNet只做了3x3卷积的deepwise convolution,而1x1的卷积还是传统的卷积方式,还存在大量冗余,ShuffleNet则在此基础上,将1*1卷积做了shuffle和group操作,实现了channel shuffle 和pointwise group convolution操作(其实就是引入了1x1分组卷积),最终使得速度和精度都比mobileNet有提升
- block:
1*1 group conv
升维+channel shuffle
+3*3DW conv
+1*1 group conv
降维 - 注意相对于基本ResNet轻量级结构,3x3的depthwise convolution之后没有使用ReLU激活函数
- 注意步长为1和步长为2使用不同的残差结构:对于每个阶段,第一个基本单元采用的是stride=2(残差使用Add),这样特征图width和height各降低一半,而通道数增加一倍。后面的基本单元都是stride=1(残差使用Concat),特征图和通道数都保持不变。对于基本单元来说,其中瓶颈层,就是3x3卷积层的通道数为输出通道数的1/4,这和残差单元的设计理念是一样的。
channel shuffle:对group convolution之后的特征图进行“重组”,这样可以保证接下来采用的group convolution其输入来自不同的组,因此信息可以在不同组之间流转(具体操作需要看源代码)
shuffleNet系列
ShuffleNetv2(2018旷视)
提出原因:
单纯的乘加运算FLOPs并不能完全表示模型的运算速度,访存开销memory access cost(MAC)也应该考虑进去
核心:
- 设计网络的4个原则
单个模块的输入输出通道相同,可以最小化访存开销(MAC)
过量使用组卷积group convolution ,会增加MAC
网络的分支越多,并行度越差
Element-wise 操作的时间是不可忽略的 - 最终结论
使用平衡的卷积,(相同的输入,输出通道数)
组卷积的group数要谨慎设计
减少网络的并行度,减少碎片化(如Inception,以及Auto ML自动产生的网络)
减少Element-wise 操作(元素级操作) - 具体做法(和v1相比):
v2中的传统模块增加了channel split(将通道分成了c-c’和c’两个通道,实验中,c’=c/2,其中一个分支直接恒等映射),实现输入和输出通道相同。
传统模块中将add操作转化为concat操作,有助于增加信息量,减少运算量(这只是在这里是这样吧,一般情况下concat的运算量更高吧)
将Group conv换成了普通的conv,可以减少group数,减少MAC
将channle shuffle操作移到残差模块的最后来做
残差结构也是使用两种结构,但都使用Concat
从Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet,MobileNetV2,ShuffleNetV2,MobileNetV3
EfficientNetv1(google 2019)和v2(google 2021)
EfficientNet网络详解
EfficientNetV2网络详解
RepVGG(2021CVPR)
核心:
- 在VGG网络的Block块中加入了Identity和残差分支,相当于把ResNet网络中的精华应用 到VGG网络中;
- 模型推理阶段,通过Op融合策略(结构重参数化)将所有的网络层都转换为Conv3*3,便于模型的部署与加速。
- 该论文中的包含的亮点包括:(1)网络训练和网络推理阶段使用不同的网络架构,训练阶段更关注精度,推理阶段更关注速度。
网络为什么要这么设计?训练时要采用多分支结构,推理时将多分支模型转换成单路模型?
-
训练时要采用多分支结构,丰富了梯度的流动性,增强模型的表征能力。
-
推理采用单路模型会更快、更省内存并且更加的灵活。
- 更快:主要是考虑到模型在推理时硬件计算的并行程度以及MAC(memory access cost),对于多分支模型,硬件需要分别计算每个分支的结果,有的分支计算的快,有的分支计算的慢,而计算快的分支计算完后只能干等着,等其他分支都计算完后才能做进一步融合,这样会导致硬件算力不能充分利用,或者说并行度不够高。而且每个分支都需要去访问一次内存,计算完后还需要将计算结果存入内存(不断地访问和写入内存会在IO上浪费很多时间)。
- 更加灵活:对于多分支的模型,结构限制较多剪枝很麻烦,而对于Plain结构的模型就相对灵活很多,剪枝也更加方便。
- 多分支转化成单路模型后很多算子进行了融合(比如Conv2d和BN融合),使得计算量变小了,而且算子减少后启动kernel的次数也减少了(比如在GPU中,每次执行一个算子就要启动一次kernel,启动kernel也需要消耗时间)。而且现在的硬件一般对3x3的卷积操作做了大量的优化,转成单路模型后采用的都是3x3卷积,这样也能进一步加速推理。
结构重参数化
- 将残差块中的
3*3
卷积层和BN层进行融合(其实就是通过BN的计算公式和卷积的计算做的线性融合); - 将另一分支的
1*1
卷积转换为3*3
卷积(对1*1
卷积周围补0); - 对最后一个分支的BN层,先构建一个
3*3
卷积,再用卷积和BN融合公式; - 最后合并所有分支的
3*3
卷积。即将所有分支的权重W和偏置B叠加起来,从而获得一个融合之后的Conv3*3
网络层。
RepVGG算法实现步骤
- 获取并划分训练数据集,并对训练集执行数据增强操作;
- 搭建RepVGG训练网络,训练分类网络,直到网络收敛为止;
- 加载训练好的网络,对该网络执行重参数化操作,具体的细节如上节所述;
- 加载重参数化后的模型,执行模型推理。
RepVGG算法存在的一些问题
(1)从训练阶段转推理阶段之前,需要执行模型重参数化操作;(2)在模型重参数化过程中会增加一些额外的计算量;(3)由于每个残差块中引入了多个残差分支,网络的参数量也增加了一些。
RepVGG网络简介
RepVGG算法详解
ConvNeXt(2022CVPR)
ConvNeXt
使用的全部都是现有的结构和方法,没有任何结构或者方法的创新。论文中的作者认为可能是随着技术的不断发展,各种新的架构以及优化策略促使Transformer
模型的效果更好,然后对标Swin Transformer
的设计用卷积进行了一系列的仿照实验。
首先利用训练 vision Transformers
的策略去训练原始的ResNet50
模型,提升了许多:AdamW优化器进行了300轮训练并使用 cosine衰减学习率调度器,前20轮进行了预热。批量大小为1024,初始化学习率为 0.001,0.05的权重衰退。我们在训练的是时候用了 [63]中的绝大多数数据增强和正则化策略。除了与在 [31]中重复的数据增强操作和 [45]中的EMA,这些没有带来性能提升。注意这点和 [63]相反,在 [63]中重复的数据增强对ViT的稳定训练是至关重要的。( [63]、[31]、[45]均为Swin Transformer论文的参考文献)。
ConvNeXt的改进策略
-
macro design:改变stage的比率、改变stem结构(卷积核大小为4x4步距为4)
-
ResNeXt:作者采用的是更激进的depthwise convolution,认为depthwise convolution和self-attention中的加权求和操作很相似。
-
inverted bottleneck:作者认为Transformer block中的MLP模块非常像MobileNetV2中的Inverted Bottleneck模块,即两头细中间粗。(但作者修改了一下顺序)
-
large kerner size:作者将depthwise conv的卷积核大小由3x3改成了7x7(和Swin Transformer一样)
-
various layer-wise micro designs:和Transformer一样,使用GELU替换ReLU;使用更少的激活函数(但在Transformer中并不是每个模块后都跟有激活函数);使用更少的Normalization;将BN替换成LN;在Swin Transformer中是通过一个单独的Patch Merging实现下采样,ConvNext网络也单独使用了一个下采样层卷积核大小为2步距为2的卷积。
ConvNeXt网络详解