余利区

 找回密码
 立即注册
查看: 79|回复: 1

分类网络

[复制链接]

1

主题

1

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2023-1-14 11:06:58 | 显示全部楼层 |阅读模式
图像分类网络经过了多轮的迭代,之前在工作中只是简单的拿来使用,最近有时间正好可以总结一下。
这篇文章想总结的图像分类网络依次是:LeNet、AlexNet-2012、VggNet-2014、GoogLeNet-2014、ResNet-2015、ResNeXt-2016、MobileNet_V1-2017、MobileNet_V2-2018、MobileNet_V3-2019、ShuffleNet_V1-2017、ShuffleNet_V2-2018、EfficientNet_V1-2019、EfficientNet_V2-2021.4、RepVGG-2021。通过前辈们的优化思路来充实一下旅游生活。(Vision Transformer、Swin Transformer、ConvNeXt、MobileViT放在另一篇博文)
1、LeNet - 1990

Lenet 是一系列网络的合称,包括 Lenet1 - Lenet5,由 Yann LeCun 等人在 1990 年《Handwritten Digit Recognition with a Back-Propagation Network》中提出,是卷积神经网络的 HelloWorld。
(1)网络结构

网络结构组成为:7 层的神经网络,包含 3 个卷积层,2 个池化层,1 个全连接层。其中所有卷积层的所有卷积核都为 5x5,步长 stride=1,池化方法都为全局 pooling,激活函数为 Sigmoid,网络结构如下:



Lenet-5网络结构

(2)网络特点


  • 相比MLP,LeNet使用了相对更少的参数,获得了更好的结果
  • 设计了maxpool来提取特征
2、AlexNet - 2012

AlexNet是2012年ILSVRC 2012(ImageNet Large Scale Visual Recognition Challenge)竞赛的冠军网络,分类准确率由传统方法的 70%+提升到 80%+(当时传统方法已经进入瓶颈期,所以这么大的提升是非常厉害的)。它是由Hinton和他的学生Alex Krizhevsky设计的。也是在那年之后,深度学习开始迅速发展。下图是从AlexNet原论文中截取的网络结构图。
(1)网络结构





(2)网络亮点


  • 首次利用 GPU 进行网络加速训练。
  • 使用了 ReLU 激活函数,而不是传统的 Sigmoid 激活函数以及 Tanh 激活函数。
  • 使用了 LRN 局部响应归一化。
  • 在全连接层的前两层中使用了 Dropout方法按一定比例随机失活神经元,以减少过拟合。
(3)其他知识点

经卷积或池化后的矩阵尺寸大小计算公式:N = (W − F + 2P ) / S + 1,其中,W :  输入特征矩阵宽度,F:卷积核大小,P:填充大小,S:步长。

2、VggNet-2014


VGG网络是在2014年由牛津大学著名研究组VGG (Visual Geometry Group) 提出,斩获该年ImageNet竞赛中 Localization Task (定位任务) 第一名 和 Classification Task (分类任务) 第二名。原论文名称是《Very Deep Convolutional Networks For Large-Scale Image Recognition》,在原论文中给出了一系列VGG模型的配置,下面这幅图是VGG16模型的结构简图。
(1)网络结构



(2)网络优缺点

VGG16相比AlexNet的一个改进是采用连续的几个3x3的卷积核代替AlexNet中的较大卷积核(11x11,7x7,5x5)。使用了3个3x3卷积核来代替7x7卷积核,使用了2个3x3卷积核来代替5*5卷积核,这样使得在相同感知野的条件下,提升网络深度,增加非线性,提升神经网络的效果。
优点

  • 网络结构简洁:整个网络都使用了同样大小的卷积核尺寸(3x3)和最大池化尺寸(2x2)
  • 节省参数:几个小滤波器(3x3)卷积层的组合比一个大滤波器(5x5或7x7)卷积层拥有更多的非线性性和更少的参数
  • 验证了通过不断加深网络结构可以提升性能。
缺点

  • VGG耗费更多计算资源,并且使用了更多的参数(全连接层的锅:VGG有3个全连接层),导致更多的内存占用(140M)。其中绝大多数的参数都是来自于第一个全连接层。这个是相对于以后的网络来说的,在AlexNet中也是三个全连接层(4096 -> 4096 -> 1000)
(3)其他知识点

感受野:在卷积神经网络中,某一层输出结果中一个元素所对应的输入层区域大小,被称作感受野。通俗的解释是,输出feature_map上的一个单元对应输入层上的区域大小。
感受野计算公式:



3、GoogLeNet-2014 - google


GoogLeNet在2014年由Google团队提出(与VGG网络同年,注意GoogLeNet中的L大写是为了致敬LeNet),斩获当年ImageNet竞赛中Classification Task (分类任务) 第一名。原论文名称是《Going deeper with convolutions》。
(1)网络结构

整体网路结构


inception结构


(2)网络优缺点

优点

  • 引入了Inception结构(融合不同尺度的特征信息)
  • 使用1x1的卷积核进行降维以及映射处理 (VGG网络中的1x1卷积仅仅是减少参数量和增加非线性性,卷积时没有增加channel维度|降低channel维度,而Inception结构中的1x1卷积核是可以用来降维的)
  • 丢弃全连接层,使用平均池化层(大大减少模型参数,除去两个辅助分类器,网络大小只有vgg的1/20)
  • 添加两个辅助分类器帮助训练:
根据实验数据,发现神经网络的中间层也具有很强的识别能力,为了利用中间层抽象的特征,在某些中间层中添加含有多层的分类器。
GoogLeNet中共增加了两个辅助的softmax分支,作用有两点:

  • 一是为了避免梯度消失,用于向前传导梯度。因为反向传播时如果有一层求导为0,链式求导结果则为0。
  • 二是将中间某一层输出用作分类,起到模型融合作用。最后的loss=loss_2 + 0.3 * loss_1 + 0.3 * loss_0。实际测试时,这两个辅助softmax分支会被去掉
缺点

  • 辅助训练器训练太麻烦了,不够简单直接
(3)其他知识点

待补充
4、ResNet - 2015 - 微软

ResNet网络是在2015年由微软实验室提出,斩获当年ImageNet竞赛中分类任务第一名,目标检测第一名。获得COCO数据集中目标检测第一名,图像分割第一名。
在ResNet网络提出之前,传统的卷积神经网络都是通过将一系列卷积层与下采样层进行堆叠得到的。但是当堆叠到一定网络深度时,就会出现两个问题。1)梯度消失或梯度爆炸。 2)退化问题(degradation problem)。在ResNet论文中说通过数据的预处理以及在网络中使用BN(Batch Normalization)层能够解决梯度消失或者梯度爆炸问题。但是对于退化问题(随着网络层数的加深,效果还会变差,如下图所示)并没有很好的解决办法。


所以ResNet论文提出了residual结构(残差结构)来减轻退化问题。下图是使用residual结构的卷积网络,可以看到随着网络的不断加深,效果并没有变差,反而变的更好了。


(1)网络结构

整体网络结构


Residual Block
接着,我们就来分析下论文中的残差结构(residual),下图是论文中给出的两种残差结构。左边的残差结构是针对层数较少网络,例如ResNet18层和ResNet34层网络。右边是针对网络层数较多的网络,例如ResNet101,ResNet152等。为什么深层网络要使用右侧的残差结构呢。因为,右侧的残差结构能够减少网络参数与运算量。同样输入、输出一个channel为256的特征矩阵,如果使用左侧的残差结构需要大约1170648个参数,但如果使用右侧的残差结构只需要69632个参数。明显搭建深层网络时,使用右侧的残差结构更合适。


(2)网络优缺点

优点

  • 提出residual结构(残差结构),来减轻退化问题,并搭建超深的网络结构(突破1000层)
  • 使用Batch Normalization加速训练(丢弃dropout):因为BN的原作者证明了网络加入BN后,可以丢弃Dropout,模型也同样具有很好的泛化效果。
缺点
ResNet网络在网络层数加深的时候,通常需要进行数周的训练时间。因此,把它应用在实际场景的成本非常高。
(3)其他知识点

BN的前世今生:天雨粟:Batch Normalization原理与实战
5、ResNeXt - 2016

更新block,将组卷积加入到了block当中,单路卷积变成多个支路的多路卷积,不过分组很多,结构一致,进行分组卷积。符合split-transform-merge的思想。总结下:split-transform-merge模式是作者归纳的一个很通用的抽象程度很高的标准范式,然后ResNeXt就这这一范式的一个简单标准实现,简洁高效。
(1)网络结构

总体网络结构


更新的Residual Block


(2)网络特点

优点:更新block,将组卷积加入到了block当中,单路卷积变成多个支路的多路卷积,参数量不变,效果很好。
这里说的参数量不变,不是指单路卷积和多路卷积二者的参数量一致,而是论文里说的,ResNet-50和ResNeXt-50(32x4d)这两个网络拥有相同的参数,但是ResNeXt-50(32x4d)精度却更高。具体入下图所示:


缺点:分组多了,多个分支单独进行处理,所以相较于原来整个一起卷积,硬件执行效率上会低一点,训练ResNeXt-101(32x4d)每个mini-batch要0.95s,而ResNet-101只要0.70s。
(3)其他知识点

组卷积


具体参考:https://zhuanlan.zhihu.com/p/32913695。
6、MobileNet_V1-2017 -  Google

AlextNet、VGG、GoogLeNet以及ResNet网络,它们都是传统卷积神经网络(都是使用的传统卷积层),缺点在于内存需求大、运算量大导致无法在移动设备以及嵌入式设备上运行。而MobileNet网络就是专门为移动端,嵌入式端而设计。
MobileNet网络是由google团队在2017年提出的,专注于移动端或者嵌入式设备中的轻量级CNN网络。相比传统卷积神经网络,在准确率小幅降低的前提下大大减少模型参数与运算量。(相比VGG16准确率减少了0.9%,但模型参数只有VGG的1/32)。
为什么和VGG比,因为它和VGG很相似,都是3x3| 1x1的直筒型。
(1)网络结构



(2)网络特点

优点
1、Depthwise Separable Convolution:DW+PW卷积大大减少运算量和参数量,约为普通卷积运算量|参数量的九分之一 ~ 八分之一
备注:常规矩阵乘法运算(GEMM)要求输入初始数据重排序,以适应相应的矩阵package,而pointwise卷积不需要数据在内存中重排序。

2、增加宽度因子,使网络大小可配置:width multiplier,增加分辨率因子:resolution multiplier

缺点
1、depthwise部分的卷积核容易废掉,即卷积核参数大部分为零【永世不得超生】。本来参数量就少,这样子就又浪费了一些。
(1)卷积核:权重数量和通道数太少,太"单薄",DW 卷积由于本身的计算特性决定它自己没有改变通道数的能力,上一层给它多少通道,
它就只能输出多少通道。所以如果上一层给的通道数本身很少的话,DW 也只能很委屈的在低维空间提特征,因此效果不够好

(2)ReLU:在处理低维数据(比如逐深度的卷积)时,relu函数会造成信息的丢失,因为落入其左边区间的数据会死掉。   
(3)低精度:16bit/8bit表示的范围有限,训练出来卷积核参数有可能是个很小的数,或者是0【感觉这个说法不靠谱,需要找人讨论】
  
2、没有残差连接(3)其他知识点

1、模型量化
深度学习模型量化(低精度推理)大总结_爱上一只柠檬的pig_head的博客-CSDN博客_深度学习量化
具体的细节还需要讨论
2、传统卷积


3、DW 、PW与普通卷积的异同
(1)计算方式不同


(2)参数量不同


mobilenetv1 为什么比普通卷积网络快?
(1)局部来看:引入DW+PW卷积,减少了运算量和参数量,width multiplier<1,resolution multiplier<1时可以缩减网络规模,小规模网络速度更快。
(2)整体来看:1x1卷积占了乘法计算量的94.86%,占了参数量的74.59%,而1x1卷积的计算和量化效率都高于普通卷积,所以整体速度会快一些。
7、MobileNet_V2-2018 -  Google

在MobileNet v1的网络结构表中能够发现,网络的结构就像VGG一样是个直筒型的,不像ResNet网络有shorcut之类的连接方式。而且有人反映说MobileNet v1网络中的DW卷积很容易训练废掉,效果并没有那么理想。
MobileNet v2相比MobileNet V1网络,准确率更高,模型更小。
刚刚说了MobileNet v1网络中的亮点是DW卷积,那么在MobileNet v2中的亮点就是Inverted residual block(倒残差结构)
(1)网络结构

总体网络结构


基本网络结构块bottleneck


(2)网络特点

1、Inverted residual block(倒残差结构)
如下图所示,左侧是ResNet网络中的残差结构,右侧就是MobileNet v2中的倒残差结构。在残差结构中是1x1卷积降维->3x3卷积->1x1卷积升维,在倒残差结构中正好相反,是1x1卷积升维->3x3DW卷积->1x1卷积降维。为什么要这样做,原文的解释是高维(就是通道数多的意思)信息通过ReLU激活函数后丢失的信息更少,进一步,ReLU激活函数对低维特征信息造成大量损失(注意倒残差结构中基本使用的都是ReLU6激活函数,但是最后一个1x1的卷积层使用的是线性激活函数)。


Residuals:          「1x1卷积降维(PW) ->ReLU  -> 3x3卷积(Normal) -> ReLU -> 1x1卷积升维(PW) -> ReLU」  Inverted Residuals: 「1x1卷积升维(PW) ->ReLU6 -> 3x3卷积(DW)-> ReLU6-> 1x1卷积降维(PW) -> Linear」
不同之处:
(1)升降维时机不同:Resnet先降维再升维,mobilenet_v2是先升维再降维。
(2)Block中间卷积不同:Resnet中间卷积是标准卷积,mobilenet_v2是DW卷积。
(3)激活函数不同:Resnet用的是ReLU激活函数,mobilenet_v2用的是ReLU6激活函数。  
Resnet全部用的是ReLU非线性激活函数,mobilenet_v2在最后一个PW卷积之后用的是Linear线性激活函数。
(4)残差模块short-cut的连接的数据不同:Resnet连接的是两个高纬的张量,mobilenet_v2连接的是两个低维的张量【废话】2、Linear Bottlenecks(线性瓶颈结构)
将Inverted Blocks的最后输出层的ReLU6去掉,直接线性输出。即降维的时候要用线性激活函数,防止信息的丢失。
作者给出的理由是: ReLU变换后保留非0区域对应于一个线性变换,仅当输入高维时ReLU能保留所有完整信息。相反,ReLU激活函数对低维特征信息造成大量损失。 而最后一个PW卷积正好是降维后的低维度,所以不采用ReLU激活函数。   

3、引入ReLU6激活函数(-----)
在x大于6的时候,y=6,对值域做了限制。这是为了在移动端设备float16的低精度的时候,也能有很好的数值分辨率,如果对ReLU的激活范围不加限制,输出范围为0到正无穷,如果激活值非常大,分布在一个很大的范围内,则低精度的float16无法很好地精确描述如此大范围的数值,从而带来精度损失。【好好看看量化】
(3)其他知识点

8、MobileNet_V3 - 2019 - Google

MobileNet_V3主要优化点为:

  • 更新Block(bneck):加入SE模块,更新了激活函数
  • 使用NAS搜索参数(Neural Architecture Search)
  • 重新设计耗时层的结构:作者使用NAS搜索之后得到的网络,接下来对网络每一层的推理时间进行分析,针对某些耗时的层结构做了进一步的优化
(1)减少第一个卷积层的卷积核个数: 32 -> 16。
        因为减少后,准确率是一样的,但是可以节约参数,缩减推理时间
(2)精简Last Satge-> Efficient Last Stage:
        在使用NAS搜索出来的Last Stage后,发现Last Stage比较臃肿,对其做精简后,准确率未下降
        但是减少了参数量,推理时间减少了7ms,约占推理时间的11%。(1)更新Block(bneck)

1、加入SE模块


2、更新激活函数
之前v2使用的是ReLU6,现在比较常用的激活函数为 swish x = x \cdot \sigma\left( x \right) ,这个激活函数计算、求导复杂;对量化过程不友好。因为 \sigma\left( x \right) 激活函数计算量大,反向传播求误差梯度时,求导涉及除法;
激活函数优化思路:
(1)用h-sigmoid替换sigmoid,因为h-sigmoid中的ReLU6对量化过程友好,
sigmoid = \sigma\left( x \right) => h-sigmoid = \frac{ReLU(x+3)}{6}
ReLU6主要是为了在移动端设备float16的低精度的时候,也能有很好的数值分辨率, 如果对ReLU的激活范围不加限制,输出范围为0到正无穷,如果激活值非常大,分布在一个很大的范围内,则低精度的float16无法很好地精确描述如此大范围的数值, 带来精度损失。
(2)用h-swish代替 swish :
swish(x) =x\cdot \sigma\left( x \right) = > h-swish(x)= x\cdot \frac{ReLU(x+3)}{6}
swish的作者认为,该函数具有无上界、有下界、平滑、非单调的特点,在深层模型上优于ReLU。 但是,由于sigmoid函数计算复杂(sigmoid(x) = (1 + exp(-x))^(-1)),所以V3改用近似函数h-swish来逼近swish,这使其变得更硬(hard)。 作者选择了ReLU6作为这个近似函数,有两个原因: 1、在几乎所有的软件和硬件框架上都可以使用ReLU6的优化实现; 2、ReLU6能在特定模式下消除由于近似sigmoid的不同实现而带来的潜在的数值精度损失。
(2)激活函数图像对比


参考:
MobileNet V3激活函数之h-swish
(2)使用NAS搜索参数


(3)重新设计耗时层的结构

(1)减少第一个卷积层的卷积核个数: 32 -> 16。
        因为减少后,准确率是一样的,但是可以节约参数,缩减推理时间
(2)精简Last Satge-> Efficient Last Stage:
        在使用NAS搜索出来的Last Stage后,发现Last Stage比较臃肿,对其做精简后,准确率未下降
        但是减少了参数量,推理时间减少了7ms,约占推理时间的11%。上述精简Last Stage-> Efficient Last Stage的逻辑是:
在MobileNet_v2的Inverted bottleneck结构中使用1x1卷积作为最后一层,用于扩大到一个更高维的特征空间,这一层对于提供丰富的特征用于预测极为重要,但也增加了延时。(是指最后一个Inverted Bottleneck的最后一个1x1 conv 的降维操作? 最后一个不是降维么?感觉是第一个升维的1x1操作



mobilenet_v2



mobilenetv3_small

为了降低延时,并保持高维空间特征,MobileNet_v3中把这一层移到了平均池化层的后面,在最后的特征集现在只需要计算1x1的分辨率,而不是原来的7x7。这种设计选择的结果是,在计算和延迟方面,特性的计算变得几乎是免费的。



MBv2对应的结构可以概括为: bottleneck+1*1conv+GAP+FC, 现在MBv3对应的结构可以1*1conv+GAP+FC(conv1x1)+FC(conv1x1). 作者指出这样可以降低30M的FLOPs,且对精度几乎没有损失

一旦降低了该特性生成层的成本,就不再需要以前的瓶颈投影层来减少计算量。该观察允许删除前一个瓶颈层中的投影和过滤层,从而进一步降低计算复杂度。原始阶段和优化后的阶段如上图所示。
具体参见:MobileNet系列之MobileNet_v3 - 掘金
神经网络中常用的激活函数:附上文章

9、ShuffleNet_V1 - 2017 - Face++(旷世)

ShuffleNet是旷世一篇关于降低深度网络计算量的论文,号称是可以在移动设备上运行的深度网络。这篇文章可以和MobileNet、Xception和ResNeXt结合来看,因为有类似的思想。卷积的group操作从AlexNet就已经有了,当时主要是解决模型在双GPU上的训练。ResNeXt借鉴了这种group操作改进了原本的ResNet。MobileNet则是采用了depthwise separable convolution代替传统的卷积操作,在几乎不影响准确率的前提下大大降低计算量,Xception主要也是采用depthwise separable convolution改进Inception v3的结构。
ShuffleNetV1的核心就是用pointwise group convolution、channel shuffle、depthwise separable convolution代替ResNet block的相应层构成了ShuffleNet uint,达到了减少计算量和提高准确率的目的。

  • channel shuffle解决了多个group convolution叠加出现的边界效应
  • pointwise group convolution和depthwise separable convolution主要减少了计算量
(1)网络结构



able 1是ShuffleNet的结构表,基本上和ResNet是一样的,也是分成几个stage(ResNet中有4个stage,这里只有3个),然后在每个stage中用ShuffleNet unit代替原来的Residual block,这也就是ShuffleNet算法的核心。这个表是在限定complexity的情况下,通过改变group(g)的数量来改变output channel的数量,更多的output channel一般而言可以提取更多的特征。


(2)网络特点

channel shuffle:


多个group操作叠加在一起,如Figure1(a)的两个卷积层都有group操作,显然就会产生边界效应,什么意思呢?就是某个输出channel仅仅来自输入channel的一小部分。这样肯定是不行的的,学出来的特征会非常局限。于是就有了channel shuffle来解决这个问题,先看Figure1(b),在进行GConv2之前,对其输入feature map做一个分配,也就是每个group分成几个subgroup,然后将不同group的subgroup作为GConv2的一个group的输入使得GConv2的每一个group都能卷积输入的前一个所有group的feature map,这和Figure1(c)的channel shuffle的思想是一样的。
pointwise group convolutions:
其实就是带group的卷积核为1*1的卷积,也就是说pointwise convolution是卷积核为1*1的卷积。在ResNeXt中主要是对3*3的卷积做group操作,但是在ShuffleNet中,作者是对1*1的卷积做group的操作,因为作者认为1*1的卷积操作的计算量不可忽视(不可忽视你还用?--> 莫生气,客观请看 --> group 1x1参数量 < 1x1参数量)
Figure2(a)是ResNet中的bottleneck unit,不过将原来的3*3 Conv改成3*3 DWConv,作者的ShuffleNet主要也是在这基础上做改动。
Figure2(b)首先用带group的1*1卷积代替原来的1*1卷积,同时跟一个channel shuffle操作。然后是3*3 DWConv表示depthwise separable convolution。
Figure2(c)添加了一个Average pooling和设置了stride=2,另外原来Resnet最后是一个Add操作,也就是元素值相加,而在(c)中是采用concat的操作,也就是按channel合并,类似googleNet的Inception操作。


depthwise separable convolution:
其实就是将传统的卷积操作分成两步,假设原来是3*3的卷积,那么depthwise separable convolution就是先用M个3*3卷积核一对一卷积输入的M个feature map,不求和,生成M个结果,然后用N个1*1的卷积核正常卷积前面生成的M个结果,求和,最后得到N个结果。
参数量对比:


(3)实验结果

Table2表示不同大小的ShuffleNet在不同group数量情况下的分类准确率比较。ShuffleNet s*表示将ShuffleNet 1*的filter个数变成s倍。arch2表示将原来网络结构中的Stage3的两个uint移除,同时在保持复杂度的前提下widen each feature map。
Table2的一个重要结论是group个数的线性增长并不会带来分类准确率的线性增长。但是发现ShuffleNet对于小的网络效果更明显,因为一般小的网络的channel个数都不多,在限定计算资源的前提下,ShuffleNet可以使用更多的feature map。


Table3表示channel shuffle的重要性(自己和自己比)


Table4是几个流行的分类网络的分类准确率对比。Table5是ShuffleNet和MobileNet的对比,效果还可以。(其实是不咋地)


10、ShuffleNet_V2 - 2018 - 旷世(Face++)

提出计算复杂度不能只看FLOPs,并提出了4条设计高效的网络准则,随之提出新的block设计。在同等复杂度下,ShuffleNetv2比ShuffleNet和MobileNetv2更准确。【之所以和MobileNetv2比,是因为MobileNetv2也是2018年出的的一个比较优秀的网络】


(1)4条设计高效网络的准则  - 需要讨论给出具体这么说的原因


  • 当卷积层的输入特征矩阵与输出特征矩阵channel相等时,Mac最小(保持FLOPs不变时):这里假定输入和输出特征的通道数分别为 c_{1}和c_{2},特征图的空间大小为h\times w,那么1x1卷积的FLOPs为B=hwc_1c_2。对应的MAC为hw(c_1+c_2)+c_1c_2(这里假定内存足够),根据均值不等式,固定B时,MAC存在下限(令c_2=\frac{B}{hwc_1}):
\\MAC \geq 2\sqrt{hwB}+\frac{B}{hw}
仅当 c_1=c_2时,MAC取最小值,这个理论分析也通过实验得到证实,如表1所示,通道比为1:1时速度更快。



  • 当GConv的groups增大时(保持FLOPs不变时),MAC也会增大:分组过多会增加MAC。对于组卷积,FLOPs为B=hwc_1c_2/g(其中g是组数),而对应的MAC为hw(c_1+c_2)+c_1c_2/g。如果固定输入c_1\times h \times w以及B,那么MAC为:  \\MAC = hwc_1 + Bg/c_1 + B/hw 可以看到,当g增加时,MAC会同时增加。这点也通过实验证实,所以明智之举是不要使用太大g的组卷积。
  • 网络碎片化会降低并行速度:一些网络如Inception,以及Auto ML自动产生的网络NASNET-A,它们倾向于采用“多路”结构,即存在一个lock中很多不同的小卷积或者pooling,这很容易造成网络碎片化,减低模型的并行度,相应速度会慢,这也可以通过实验得到证明。
  • Element-wise操作带来的影响时不可忽视的:对于元素级(element-wise operators)比如ReLU和Add,虽然它们的FLOPs较小,但是却需要较大的MAC。这里实验发现如果将ResNet中残差单元中的ReLU和shortcut移除的话,速度有20%的提升。
建议:

  • 使用"均衡"卷积:卷积的输入通道数和输出通道数相等
  • 对Group Conv产生的代价保持警惕
  • 减少网络碎片化程度
  • 减少Element-wise操作
    除以上外,还要考虑平台特性,例如内存操作和代码优化等
(2)更新的block设计

根据前面的4条准则,作者分析了ShuffleNetv1设计的不足,并在此基础上改进得到了ShuffleNetv2,两者模块上的对比如图3所示:



图3:ShuffleNet两个版本结构上的对比

在ShuffleNetv1的模块中,大量使用了1x1组卷积,这违背了G2原则,另外v1采用了类似ResNet中的瓶颈层(bottleneck layer),输入和输出通道数不同(哪里通道数不同了?),这违背了G1原则。同时使用过多的组,也违背了G3原则。短路连接中存在大量的元素级Add运算,这违背了G4原则。
为了改善v1的缺陷,v2版本引入了一种新的运算:channel split。具体来说,在开始时先将输入特征图在通道维度分成两个分支:通道数分别为 c'和c-c',实际实现时c'=c/2。左边分支做同等映射,右边的分支包含3个连续的卷积,并且输入和输出通道相同,这符合G1。而且两个1x1卷积不再是组卷积,这符合G2,另外两个分支相当于已经分成两组。两个分支的输出不再是Add元素,而是concat在一起,紧接着是对两个分支concat结果进行channle shuffle,以保证两个分支信息交流。其实concat和channel shuffle可以和下一个模块单元的channel split合成一个元素级运算,这符合原则G4
对于下采样模块,不再有channel split,而是每个分支都是直接copy一份输入,每个分支都有stride=2的下采样,最后concat在一起后,特征图空间大小减半,但是通道数翻倍。根据前面的4条准则,作者分析了ShuffleNetv1设计的不足,并在此基础上改进得到了ShuffleNetv2,两者模块上的对比如图3所示:



图3:ShuffleNet两个版本结构上的对比

(3)其他知识点

FLOPS:全大写,指每秒浮点运算次数,可以理解为计算的速度。是衡量硬件性能的一个指标。【硬件】FLOPs:s小写,指浮点运算数,理解为计算量。可以用来衡量算法|模型的复杂度【模型】,在论文中常用GFLOPs(1 GFLOPs = 10^9 FLOPs)
MAC:memory access cost,内存访问代价
参考文章:小小将:ShuffleNetV2:轻量级CNN网络中的桂冠
11、EfficientNet_V1 - 2019

同时探索输入分辨率、网络深度、宽度影响,并基于范式探索出EfficientNetB0-B7,其中,EfficientNet-B7在Imagenet top-1上达到了当年最高准确率84.3%,与之前准确率最高的GPipe相比,参数数量(Params)仅为其1/8.4,推理速度提升了6.1倍,又快又轻量。下图是EfficientNet与其他网络的对比。
注:在EfficientNet_V1作者关注的是准确率,参数数量以及FLOPs(理论上计算量小不代表速度快)


背景

  • 根据以往的经验,增加网络的深度depth能够得到更加丰富、复杂的特征并且能够很好的应用到其它任务中。但网络的深度过深会面临梯度消失,训练困难的问题。
  • 增加网络的width能够获得更高细粒度的特征并且也更容易训练,但对于width很大而深度较浅的网络往往很难学习到更深层次的特征。
  • 增加输入网络的图像分辨率能够潜在的获得更高细粒度的特征模板,但对于非常高的输入分辨率,准确率的增益也会减小。并且大分辨率图像会增加计算量。【记住了~】
具体如下图所示:


作者提出了作者又提出了一个混合缩放方法 ( compound scaling method) 在这个方法中使用了一个混合因子ϕ 去统一的缩放width,depth,resolution参数,具体的计算公式如下:
depth: d= \alpha^{\phi}   
width: w= \beta^{\phi}
resolution: r= \gamma^{\phi}
约束条件为: \alpha \cdot \beta^{2}  \cdot \gamma^{2}  \approx 2
\alpha \geq 1,\beta \geq 1, \gamma \geq 1
注意:

  • FLOPs(理论计算量)与depth的关系是:当depth翻倍,FLOPs也翻倍。
  • FLOPs与width(channel)的关系是:当width翻倍(即channal翻倍),FLOPs会翻4倍,因为卷积层的FLOPs约等于​ feature_{w} \times feature_{h} \times feature_{c} \times kernal_{w} \times kernal_{h}  \times kernal_{number} ,在输入矩阵宽高不变的情况下,width翻倍时,输入特征矩阵的channel和输出特征矩阵的channel都会翻倍,所以FLOPs会翻倍4倍。
  • FLOPs与resolution的关系是:当resolution翻倍,FLOPs也会翻4倍,和上面类似因为特征矩阵的宽度 都会翻倍。
所以总的FLOPs倍率可以近似用 (\alpha \cdot \beta^{2} \cdot \gamma^{2})^{\phi} 来表示,当限制 \alpha \cdot \beta^{2} \cdot \gamma^{2} \approx 2 时,对于任意一个 \phi 而言FLOPs相当于 2^{\phi} 倍。
接下来作者在基准网络EfficientNetB-0上使用NAS来搜索α , β , γ这三个参数,得到EfficientNetB-0最佳参数为α = 1.2 , β = 1.1 , γ = 1.15。接着固定α = 1.2 , β = 1.1 , γ = 1.15,在EfficientNetB-0的基础上使用不同的ϕ分别得到EfficientNetB-1至EfficientNetB-7(在后面的EfficientNet(B0-B7)参数章节有给出详细参数)
需要注意的是,对于不同的基准网络搜索出的α , β , γ也不定相同。还需要注意的是,在原论文中,作者也说了,如果直接在大模型上去搜索α , β , γ能获得更好的结果,但是在较大的模型中搜索成本太大(Google大厂居然说这种话),所以EfficientNetB-1至EfficientNetB-7就在比较小的EfficientNetB-0模型上进行搜索的
(1)网络结构

EfficientNetB-0
下表为EfficientNet-B0的网络框架(B1-B7就是在B0的基础上修改Resolution,Channels以及Layers),可以看出网络总共分成了9个Stage,第一个Stage就是一个卷积核大小为3x3步距为2的普通卷积层(包含BN和激活函数Swish),Stage2~Stage8都是在重复堆叠MBConv结构(最后一列的Layers表示该Stage重复MBConv结构多少次),而Stage9由一个普通的1x1的卷积层(包含BN和激活函数Swish)一个平均池化层和一个全连接层组成。表格中每个MBConv后会跟一个数字1或6,这里的1或6就是倍率因子n即MBConv中第一个1x1的卷积层会将输入特征矩阵的channels扩充为n倍,其中k3x3或k5x5表示MBConv中Depthwise Conv所采用的卷积核大小。Channels表示通过该Stage后输出特征矩阵的Channels。


MBConv结构


如图所示,MBConv结构主要由一个1x1的普通卷积(升维作用,包含BN和Swish),一个kxk的Depthwise Conv卷积(包含BN和Swish),k的具体值主要有3x3和5x5两种情况,一个SE模块,一个1x1的普通卷积(降维作用,包含BN),一个Droupout层构成。搭建过程中还需要注意几点:

  • 第一个升维的1x1卷积层,它的卷积核个数是输入特征矩阵channel的n倍,n ∈ { 1 , 6 }。
  • 当n = 1 时,不要第一个升维的1x1卷积层,即Stage2中的MBConv结构都没有第一个升维的1x1卷积层(这和MobileNetV3网络类似)。
  • 关于shortcut连接,仅当输入MBConv结构的特征矩阵与输出的特征矩阵shape相同时才存在(代码中可通过stride==1 and inputc_channels==output_channels条件来判断)。
  • SE模块如下所示,由一个全局平均池化,两个全连接层组成。第一个全连接层的节点个数是输入该MBConv特征矩阵channels的1/4  ,且使用Swish激活函数。第二个全连接层的节点个数等于Depthwise Conv层输出的特征矩阵channels,且使用Sigmoid激活函数
  • Dropout层的dropout_rate在tensorflow的keras源码中对应的是drop_connect_rate(注意,在源码实现中只有使用shortcut的时候才有Dropout层)
SE结构


(2)网络特点

EfficientNetB-0


依次延伸出来的网络结构EfficientNetB-0 - EfficientNetB-7



  • input_size代表训练网络时输入网络的图像大小
  • drop_connect_rate是在MBConv结构中dropout层使用的drop_rate,在官方keras模块的实现中MBConv结构的drop_rate是从0递增到drop_connect_rate的(具体实现可以看下官方源码,注意,在源码实现中只有使用shortcut的时候才有Dropout层)。还需要注意的是,这里的Dropout层是Stochastic Depth,即会随机丢掉整个block的主分支(只剩捷径分支,相当于直接跳过了这个block)也可以理解为减少了网络的深度。具体可参考Deep Networks with Stochastic Depth这篇文章。
  • dropout_rate是最后一个全连接层前的dropout层(在stage9的Pooling与FC之间)的dropout_rate。
最后给出原论文中关于EfficientNet与当时主流网络的性能参数对比:


(3)其他知识点

参考:EfficientNet网络详解_太阳花的小绿豆的博客-CSDN博客_efficientnet
12、EfficientNet_V2 -  2021.04

EfficientNetV2: Smaller Models and Faster Training,在EfficientNet_V1作者关注的是准确率,参数数量以及FLOPs(理论上计算量小不代表速度快),在EfficientNet_V2中作者进一步关注模型的训练速度


(1)EfficientNet_V1存在的问题

1、训练图像的尺寸很大时,训练速度非常慢
这确实是个槽点,在之前使用EfficientNet时发现当使用到B3(img_size=300)- B7(img_size=600)时基本训练不动,而且非常吃显存(显存不够时OOM)。见下表。


2、在网络浅层中使用Depthwise convolutions速度会很慢
虽然Depthwise convolutions结构相比普通卷积拥有更少的参数以及更小的FLOPs,但通常无法充分利用现有的一些加速器(虽然理论上计算量很小,但实际使用起来并没有想象中那么快)。在近些年的研究中,有人提出了Fused-MBConv结构去更好的利用移动端或服务端的加速器。Fused-MBConv结构也非常简单,即将原来的MBConv结构(EfficientNetv1中有提及)主分支中的expansion conv1x1和depthwise conv3x3替换成一个普通的conv3x3,如图2所示。作者也在EfficientNet-B4上做了一些测试,发现将浅层MBConv结构替换成Fused-MBConv结构能够明显提升训练速度,如表3所示,将stage2,3,4都替换成Fused-MBConv结构后,在Tesla V100上从每秒训练155张图片提升到216张。但如果将所有stage都替换成Fused-MBConv结构会明显增加参数数量以及FLOPs,训练速度也会降低。所以作者使用NAS技术去搜索MBConv和Fused-MBConv的最佳组合。



MBConv和Fused-MBConv结构



MBConv替换实验

3、同等放大每个stage是次优的
在EfficientNetV1中,每个stage的深度和宽度都是同等放大的。但每个stage对网络的训练速度以及参数数量的贡献并不相同,所以直接使用同等缩放的策略并不合理。在这篇文章中,作者采用了非均匀的缩放策略来缩放模型,即逐步向后续阶段添加更多的层。【这样每层的缩放因子就不同了】
(2)EfficientNetV2中做出的贡献

在之前的一些研究中,大家主要关注的是准确率以及参数量。但在近些年的研究中,大家开始关注网络的训练速度以及推理速度(可能是准确率刷不动了)。但他们提升训练速度通常是以增加参数数量作为代价的(这个表述感觉有问题:增加参数数量后,训练速度不是会变慢么)。而这篇文章是同时关注训练速度以及参数数量的。
这篇文章做出的三个贡献:

  • 引入新的网络(EfficientNetV2),该网络在训练速度以及参数数量上都优于先前的一些网络。(解决EfficientNetV1中的问题二:在网络浅层中使用Depthwise convolutions速度会很慢)
  • 提出了改进的渐进学习方法,该方法会根据训练图像的尺寸动态调节正则方法(例如dropout、data augmentation和mixup)。通过实验展示了该方法不仅能够提升训练速度,同时还能提升准确率。(解决EfficientNetV1中的问题一:训练图像的尺寸很大时,训练速度非常慢)
通过实验与先前的一些网络相比,训练速度提升11倍,参数数量减少为1/6.8
(3)EfficientNetV2-S网络结构

作者以EfficientNet作为backbone,采用NAS搜索架构,选取的优化目标为:accuracy、parameter efficiency、trainning efficiency,涉及空间包含:

  • convolutional operation type : {MBConv, Fused-MBConv}
  • number of layer
  • kernel size : {3x3, 5x5}
  • expansion ratio (MBConv中第一个expand conv1x1或者Fused-MBConv中第一个expand conv3x3): {1, 4, 6}
搜索完毕以后EfficientNetV2-S网络结构:


Stride就是步距,注意每个Stage中会重复堆叠Operator模块多次,只有第一个Opertator模块的步距是按照表格中Stride来设置的,其他的默认都是1。 #Channels表示该Stage输出的特征矩阵的Channels,#Layers表示该Stage重复堆叠Operator的次数。
注意当stride=1且输入输出Channels相等时才有shortcut连接。还需要注意的是,当有shortcut连接时才有Dropout层,而且这里的Dropout层是Stochastic Depth,即会随机丢掉整个block的主分支(只剩捷径分支,相当于直接跳过了这个block)也可以理解为减少了网络的深度。具体可参考Deep Networks with Stochastic Depth这篇文章。
(4)网络特点

相比与EfficientNetV1,主要有以下不同:

  • EfficientNetV2中除了使用到MBConv模块外,还使用了Fused-MBConv模块(主要是在网络浅层中使用)。
  • EfficientNetV2会使用较小的expansion ratio(MBConv中第一个expand conv1x1或者Fused-MBConv中第一个expand conv3x3)比如4,在EfficientNetV1中基本都是6. 这样的好处是能够减少内存访问开销。
  • EfficientNetV2中更偏向使用更小(3x3)的kernel_size,在EfficientNetV1中使用了很多5x5的kernel_size。通过下表可以看到使用的kernel_size全是3x3的,由于3x3的感受野是要比5x5小的,所以需要堆叠更多的层结构以增加感受野。
  • 移除了EfficientNetV1中最后一个步距为1的stage(就是EfficientNetV1中的stage8),可能是因为它的参数数量过多并且内存访问开销过大(由于网络是通过NAS搜索出来的,所有这里也是作者的猜测)。
个人理解:(待补充)

  • 在浅层网络中还是需要用小的正常卷积核来提取低维特征
  • 在深层网络中,采用DW卷积可以节省参数量
(5)其他知识点

Fused-MBConv结构


MBConv结构


Deep Networks with Stochastic Depth


渐进式学习策略
作者就提出了渐进式训练策略Progressive Learning。如下图所示,在训练早期使用较小的训练尺寸以及较弱的正则方法weak regularization,这样网络能够快速的学习到一些简单的表达能力。接着逐渐提升图像尺寸,同时增强正则方法adding stronger regularization。这里所说的regularization包括dropout rate,RandAugment magnitude以及mixup ratio。



参考:EfficientNetV2网络详解_太阳花的小绿豆的博客-CSDN博客_efficientnetv2
13、RepVGG - CVPR - 2021 - 结构重参数化

参考文章:丁霄汉:RepVGG:极简架构,SOTA性能,让VGG式模型再次伟大(CVPR-2021)
2020年B站年度弹幕是“爷青回”。一定有很多瞬间,让你感觉“爷的青春回来了”。在这个卷积网络各种超参精确到小数点后三位的时代,你是否还记得五六年前的田园时代,堆几个卷积层就能涨点的快乐? ResNet和Inception等模型提出后,大家的研究重点逐渐转向各种多分支卷积网络架构,VGG这样的“直筒型”简单架构鲜有问津。而我们相信科学技术总是螺旋式地上升。我们捡起七年前的老架构,注入了一个新想法。让七年前的模型再次跟上SOTA,是多么有趣的一件事!
我们最近的工作RepVGG,用结构重参数化(structural re-parameterization)“复兴”VGG式单路极简架构,一路3x3卷到底,在速度和性能上达到SOTA水平,在ImageNet上超过80%正确率。已经被CVPR-2021接收。
不用NAS,不用attention,不用各种新颖的激活函数,甚至不用分支结构,只用3x3卷积和ReLU,也能达到SOTA性能!
一般所说的“VGG式”指的是:
1、没有任何分支结构。即通常所说的plain或feed-forward架构。
2、仅使用3x3卷积。
3、仅使用ReLU作为激活函数。
下面用一句话介绍RepVGG模型的基本架构:将20多层3x3卷积堆起来,分成5个stage,每个stage的第一层是stride=2的降采样,每个卷积层用ReLU作为激活函数。
再用一句话介绍RepVGG模型的详细结构:RepVGG-A的5个stage分别有[1, 2, 4, 14, 1]层,RepVGG-B的5个stage分别有[1, 4, 6, 16, 1]层,宽度是[64, 128, 256, 512]的若干倍。这里的倍数是随意指定的诸如1.5,2.5这样的“工整”的数字,没有经过细调。
再用一句话介绍训练设定:ImageNet上120 epochs,不用trick,甚至直接用PyTorch官方示例的训练代码就能训出来!
为什么要设计这种极简模型,这么简单的纯手工设计模型又是如何在ImageNet上达到SOTA水平的呢?
为什么要用VGG式模型
除了相信简单就是美以外,VGG式极简模型至少还有五大现实的优势(详见论文)。
1. 3x3卷积非常快:在GPU上,3x3卷积的计算密度(理论运算量除以所用时间)可达1x1和5x5卷积的四倍
2. 单路架构非常快:因为并行度高。同样的计算量,“大而整”的运算效率远超“小而碎”的运算。
3. 单路架构省内存:例如,ResNet的shortcut虽然不占计算量,却增加了一倍的显存占用。
4. 单路架构灵活性更好,容易改变各层的宽度(如剪枝)。
5. RepVGG主体部分只有一种算子:3x3卷积接ReLU。在设计专用芯片时,给定芯片尺寸或造价,我们可以集成海量的3x3卷积-ReLU计算单元来达到很高的效率。别忘了,单路架构省内存的特性也可以帮我们少做存储单元。
结构重参数化让VGG再次伟大
相比于各种多分支架构(如ResNet,Inception,DenseNet,各种NAS架构),近年来VGG式模型鲜有关注,主要自然是因为性能差。例如,有研究[1]认为,ResNet性能好的一种解释是ResNet的分支结构(shortcut)产生了一个大量子模型的隐式ensemble(因为每遇到一次分支,总的路径就变成两倍),单路架构显然不具备这种特点。
既然多分支架构是对训练有益的,而想要部署的模型是单路架构,就提出解耦训练时和推理时架构。我们通常使用模型的方式是:
1. 训练一个模型
2. 部署这个模型
但在这里,提出一个新的做法:
1. 训练一个多分支模型
2. 将多分支模型等价转换为单路模型
3. 部署单路模型
这样就可以同时利用多分支模型训练时的优势(性能高)和单路模型推理时的好处(速度快、省内存)。这里的关键显然在于这种多分支模型的构造形式和转换的方式。
我们的实现方式是在训练时,为每一个3x3卷积层添加平行的1x1卷积分支和恒等映射分支,构成一个RepVGG Block。这种设计是借鉴ResNet的做法,区别在于ResNet是每隔两层或三层加一分支,而我们是每层都加。
(1)网络结构




RepVGG 结构

个人总结RepVGG优势:

  • 更快:并行度高,GPU可以全部跑满,之前3x3、1x1、BN三路完成时间不同;time:3x3>1x1>BN
  • 省内存:没有结构重参数化前,每个分支都要访问输入特征图,内存就要访问3次
  • 更加灵活:算子启动少,之前3x3、1x1、BN都要启动一次kernel



结构重参数化图解

(2)结构重参数化详解

1、3x3卷积重参数化







2、1x1卷积重参数化


3、BN重参数化


4、结构重参数化 - 多分支融合



(3)总体模型




总体模型结构

(4)实验结果

在1080Ti上测试,RepVGG模型的速度-精度相当出色。在公平的训练设定下,同精度的RepVGG速度是ResNet-50的183%,ResNet-101的201%,EfficientNet的259%,RegNet的131%。注意,RepVGG取得超过EfficientNet和RegNet的性能并没有使用任何的NAS或繁重的人工迭代设计。


这也说明,在不同的架构之间用FLOPs来衡量其真实速度是欠妥的。例如,RepVGG-B2的FLOPs是EfficientNet-B3的10倍,但1080Ti上的速度是后者的2倍,这说明前者的计算密度是后者的20余倍。
在Cityscapes上的语义分割实验表明,在速度更快的情况下,RepVGG模型比ResNet系列高约1%到1.7%的mIoU,或在mIoU高0.37%的情况下速度快62%。


另外一系列ablation studies和对比实验表明,结构重参数化是RepVGG模型性能出色的关键(详见论文)。
最后需要注明的是,RepVGG是为GPU和专用硬件设计的高效模型,追求高速度、省内存,较少关注参数量和理论计算量在低算力设备上,可能不如MobileNet和ShuffleNet系列适用。(这句说明了模型的适用条件
参考:丁霄汉:RepVGG:极简架构,SOTA性能,让VGG式模型再次伟大(CVPR-2021)
参考:RepVGG网络简介_太阳花的小绿豆的博客-CSDN博客_repvgg网络是干嘛的?
回复

使用道具 举报

3

主题

8

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2025-5-5 03:01:15 | 显示全部楼层
求沙发
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

云顶设计嘉兴有限公司模板设计.

免责声明:本站上数据均为演示站数据,如购买模板可以上DISCUZ应用中心购买,欢迎惠顾.

云顶官方站点:云顶设计 模板原创设计:云顶模板   Powered by Discuz! X3.4© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表