CNN模型合集-Mengcius专栏
【CNN常见模型0——储备知识】深度神经网络(DNN)模型,前向传播算法和反向传播算法(BP)
【CNN常见模型0】卷积神经网络(CNN)模型结构
【CNN常见模型1】CNN基础知识和经典CNN模型汇总
【CNN常见模型2】经典CNN模型汇总
【CNN常见模型3】经典CNN模型汇总
【深度学习】卷积神经网络CNN结构发展整理(图像分类)
卷积网络在本质上是一种输入到输出的映射,它能够学习大量的输入和输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式。
CNN模型由输入层、卷积层(Relu激活函数)、池化层、全连接层(也就是DNN+softmax)、输出层组成。
BP神经网络:分为信号前向传播和误差反向传播两个阶段。
- 前向传播
信号的前向传播,从输入层经过隐含层,最后到达输出层。 - 反向传播
误差的反向传播,从输出层到隐含层,最后到输入层,依次调节隐含层到输出层的权重和偏置,输入层到隐含层的权重和偏置。
LeNet5-1998年
2+2+1
是Yann LeCun在1998年设计的用于手写数字识别的卷积神经网络,当年美国大多数银行就是用它来识别支票上面的手写数字的,它是早期卷积神经网络中最有代表性的实验系统之一。
LeNet5由两个卷积层,两个池化层,两个全连接层组成。卷积核都是5×5,stride=1,池化层使用maxpooling。
AlexNet-2012年
5 + 3
Alex Krizhevsky提出了深度卷积神经网络模型AlexNet,它可以算是LeNet的一种更深更宽的版本。它可以说是神经网络在低谷期后的第一次发声,确立了深度学习(深度卷积网络)在计算机视觉的统治地位,同时也推动了深度学习在语音识别、自然语言处理、强化学习等领域的拓展。
AlexNet模型共八层(不算input层、poolling层、LRN层),包含五个卷积层、三个全连接层。最后一层使用softmax做分类输出。
AlexNet的结构如下:
输入的图片是256×256,然后进行随机的裁剪得到227×227大小,然后输入进网络中。
整个网络呈一个金字塔结构,具体来说:
输入图片是224x224像素的三通道图片;
第一层使用11x11的卷积核,滑动步长为4个像素,输出为96个特征图并进行最大值池化;
第二层使用5x5卷积核,卷积产生256个特征图,并进行最大池化;
第三层,第四层均使用3x3卷积核,输出384个特征图;
第五层使用3x3卷积层,输出256个特征图,并进行池化;
第六层,第七层为全连接层,分别包含4096个隐层,也就是说,到全连接层时只剩4096个特征值;
最终,第八层为softmax层,得到最终的分类结果。
整个AlexNet有8个需要训练参数的层(不包括池化层和LRN层),前5层为卷积层,后3层为全连接层,如图4所示。AlexNet最后一层是有1000类输出的Softmax层用作分类。 LRN层出现在第1个及第2个卷积层后,而最大池化层出现在两个LRN层及最后一个卷积层后。ReLU激活函数则应用在这8层每一层的后面。
关于AlexNet有如下要点:
1、在ImageNet数据上对网络进行了培训,该数据包含来自22,000多个类别的超过1500万个带注释的图像。
2、使用ReLU进行非线性函数(发现减少训练时间,因为ReLU比传统的tanh函数快几倍)。
3、使用的数据增强技术包括图像转换,水平反射和补丁提取。
4、实施了dropout层,以解决过度拟合训练数据的问题。
5、使用mini-batch SGD训练模型,具有动量和重量衰减的特定值。
6、在两个GTX 580 GPU上训练五到六天。
7、每一层权重均初始化为0均值0.01标准差的高斯分布,在第二层、第四层和第五层卷积的偏置被设置为1.0,而其他层的则为0,目的是为了加速早期学习的速率(因为激活函数是ReLU,1.0的偏置可以让大部分输出为正)。
8、学习速率初始值为0.01,在训练结束前共减小3次,每次减小都出现在错误率停止减少的时候,每次减小都是把学习速率除以10 。
9、局部响应归一化。在使用饱和型的激活函数时,通常需要对输入进行归一化处理,以利用激活函数在0附近的线性特性与非线性特性,并避免饱和,但对于ReLU函数,不需要输入归一化。然而,Alex等人发现通过LRN这种归一化方式可以帮助提高网络的泛化性能。LRN的作用就是,对位置(x, y)处的像素计算其与几个相邻的kernel maps的像素值的和,并除以这个和来归一化。
VGGNet-2014年
5(2~4)+ 3
减小过滤器。层次更深。
PyTorch实现VGG亲身实践
VGG模型是2014年ILSVRC竞赛的第二名,第一名是GoogLeNet。但是VGG模型在多个迁移学习任务中的表现要优于googLeNet。而且,从图像中提取CNN特征,VGG模型是首选算法。
2014年被牛津大学的Karen Simonyan 和Andrew Zisserman提出,主要特点是 “简洁,深度”。 深, 是因为VGG最深有19层,远远超过了它的前辈; 而简洁,则是在于它的结构上,一律采用stride为1的3×3filter,以及stride为2的2×2MaxPooling。它是第一个在各个卷积层使用更小的 3×3 过滤器(filter),并把它们组合作为一个卷积序列进行处理的网络。
VGGNet是继承了AlexNet的思路,以AlexNet为基础,尝试建立一个层次更多,深度更深的网络。其网络结构一样可以由8个层次所构成,也是5组卷积层,3层全连接层。最主要的区别在于,VGGNet的每个卷积层并不是只做一次卷积操作,而是连续卷积2~4次。
VGGNet拥有5段卷积,每一段内有2~3个卷积层,同时每段尾部会连接一个最大池化层用来缩小图片尺寸。每段内的卷积核数量一样,越靠后的段的卷积核数量越多:64 – 128 – 256 – 512 – 512。
VggNet一共有六种不同的网络结构,但是每种结构都有含有5组卷积,每组卷积都使用3x3的卷积核,每组卷积后进行一个2x2最大池化,接下来是三个全连接层.在训练高级别的网络时,可以先训练低级别的网络,用前者获得的权重初始化高级别的网络,可以加速网络的收敛。
在训练中,VGGNet还使用了Multi-Scale的方法做数据增强,将原始图像缩放到不同尺寸S,然后再随机裁切224´224的图片,这样能增加很多数据量,对于防止模型过拟合有很不错的效果。
在预测时,VGG采用Multi-Scale的方法,将图像scale到一个尺寸Q,并将图片输入卷积网络计算。然后在最后一个卷积层使用滑窗的方式进行分类预测,将不同窗口的分类结果平均,再将不同尺寸Q的结果平均得到最后结果,这样可提高图片数据的利用率并提升预测准确率。
关于VGGNet有如下要点:
1、仅使用3x3尺寸的filter与AlexNet的第一层11x11 filter 和ZF Net的7x7 filter 完全不同。作者的推理是两个3x3 conv层的组合具有5x5的有效感受野。这又可以模拟更大的 filter,同时保持较小filter尺寸的优势。其中一个好处是减少了参数的数量。此外,使用两个转换层,我们可以使用两个ReLU层而不是一个。
2、3个背对背的conv层具有7x7的有效感受区域。
3、随着每层输入卷的空间大小减小(转换层和池层的结果),当您沿着网络向下时,由于filter数量的增加,卷的深度会增加。
4、有趣的是注意到每个maxpool层之后过滤器的数量翻倍。这加强了缩小空间尺寸的想法,但增加了深度。
5、在图像分类和本地化任务方面都做得很好。作者使用一种本地化形式作为回归。
6、使用Caffe工具箱构建模型。
7、在训练期间使用scale jittering比例抖动作为一种数据增强技术。
8、在每个转换层之后使用ReLU层并使用批量梯度下降进行训练。
9、在4个Nvidia Titan Black GPU上训练了两到三周。
10、LRN层作用不大(VGGNet不使用局部响应标准化(LRN),这种标准化并不能在ILSVRC数据集上提升性能,却导致更多的内存消耗和计算时间。
GoogleNet(Inception V1)-2014年
9个Inception,通过增加了多种核1x1,3x3,5x5,还有直接max pooling,增加了宽度,而且在不同深度处增加了两个loss来保证梯度回传消失的现象。
虽然VGG的网络的层数更多,深度更深,但模型越复杂,参数越多,越容易过拟合,梯度消失、计算量大。正是围绕着这两个思路,Google的大神们启动了Inception项目,其通过构建密集的块结构——Inception(如下图)来近似最优的稀疏结构,从而达到提高性能而又不大量增加计算量的目的,GoogleNet就是它的第一个版本(目前共有4个版本)。
GoogleNet对输入做了4个分支,分别用不同尺寸的filter进行卷积或池化,最后再在特征维度上拼接到一起。inception结构相当于把相关性强的特征汇聚在一起,起到加速收敛的作用。
GoogleNet跳出直线加深网络层数的思路,通过增加“宽度”的方式增加网络复杂度,避免陷入卷积核选择的陷阱,让程序自己学习如何选择卷积核。具体来说中,是在每一个卷积层,并行使用11卷积核,33卷积核,55卷积核和池化,同时提取不同尺度的特征,然后通过11的卷积核对每一个分支进行降维后,最后将结果合并拼接在一起。
谷歌Inception网络中的Inception-V3到Inception-V4具体作了哪些优化?
从Inception v1到Inception-ResNet,一文概览Inception家族的「奋斗史」
PyTorch实现GoogleNet亲身实践
在inception模块中有一个分支使用了max pooling,作者认为pooling也能起到提取特征的作用,所以也加入模块中。注意这个pooling的stride=1,pooling后没有减少数据的尺寸。
GoogLeNet网络结构中有3个LOSS单元,这样的网络设计是为了帮助网络的收敛。在中间层加入辅助计算的LOSS单元,目的是计算损失时让低层的特征也有很好的区分能力,从而让网络更好地被训练。在论文中,这两个辅助LOSS单元的计算被乘以0.3,然后和最后的LOSS相加作为最终的损失函数来训练网络。
GoogLeNet还有一个闪光点值得一提,那就是将后面的全连接层全部替换为简单的全局平均pooling,在最后参数会变的更少。
关于GoogLeNet有如下要点:
1、在整个架构中使用了9个Inception模块,总共超过100层!现在这很深…
2、没有使用完全连接的层!他们使用平均水池,从7x7x1024 volume到1x1x1024 volume。这节省了大量参数。
3、使用的参数比AlexNet少12倍。
4、在测试过程中,创建了相同图像的多个作物,并将其输入网络,并对softmax概率进行平均,以便为我们提供最终解决方案。
5、利用R-CNN的概念来检测它们的检测模型。
6、Inception模块有更新版本(版本6和7)。
7、接受“一周内几个高端GPU”的训练。
- Inception-v2
Inception-v2是在第一代的GoogleNet基础上加入了批标准化(Batch Normalization)技术。其具体做法是,对mini-batch中所有的信号量进行统一的归一化,使得一个批次中所有的信号量符合均值为0,方差为1的高斯分布,将5×5卷积替换成两个连续的3×3卷积,使网络更深,参数更少。需要注意的是,在tensorflow中,使用批标准化技术要在激活函数之前,否则作用会打一定的折扣。 - Inception-v3
Inception-v3在之前的版本上又有提高。其最核心的思想是将卷积核操作继续分解成更小的卷积核。首先,比如,借鉴VGGNets的思路,55的卷积可以由连续2层33卷积所替代,这样既减少了参数数量,也进一步加快了计算速度。这样的好处是,在经过这样的转换后,不但参数数量进一步减少,计算速度更快,而且网络的深度也加深了,增加了非线性表达能力。
Inception-v3是Inception-v1的后继产品,具有24M参数。那么Inception-v2呢?它是v3的早期原型,因此非常类似于v3但不常用。当作者推出Inception-v2时,他们在其上进行了许多实验,并进行一些调整。Inception-v3是包含这些调整的网络(调整优化器,剪枝功能并向辅助网络中的辅助层添加批量标准化)。Inception-v2和Inception-v3的动机是避免表征性瓶颈(这意味着大幅减少下一层的输入维度),并通过使用因子分解方法进行更有效的计算。
-
Inception-v4
Inception- v4是Inception-v3的改进。主要区别在于Stem组和Inception-C模块中的一些小变化。作者还为每个网格尺寸的Inception块做出了统一的选择。他们还提到残差连接可以显着提高训练速度。
与Inception-v3相比改进了什么?
- 更改Stem模块
- 添加更多Inception模块
- 统一选择Inception-v3模块,意味着为每个模块使用相同数量的过滤器。
- 总之,由于模型大小的增加,Inception-v4的效果更好。
ResNet-2015年
ResNet,于2015年由微软亚洲研究院的学者们何凯明团队提出。为了解决网络加深出现的梯度弥散,导致网络退化的问题。
ResNet将浅层的输入值直接连接到端部位置,这样避免了层层映射过程中,由于权重小于1而导致的梯度消失。
ResNet模型的核心是通过建立前面层与后面层之间的“短路连接”(shortcuts,skip connection),这有助于训练过程中梯度的反向传播,从而能训练出更深的CNN网络。
PyTorch实现ResNet亲身实践
假设某段神经网络的输入是x,期望输出是H(x),如果直接把x传递到输出端,那么我们要学习的目标是F(x)=H(x)-x。此时目标相当于发生变更,称之为残差。
残差网络可以设计18、34、50、101、152层,用的都是1x1和3x3的小卷积核。
InceptionResNet-2016年
谷歌于2016年提出了InceptionResNetV1和InceptionResNetV2。二者都是将Inception同ResNet相融合,加上了shortcut的分支。Inception提出的目的是使得模型更宽,ResNet提出的目的是使得模型更深,将二者结合可以使得模型又宽又深。
从Inception v1到Inception-ResNet,一文概览Inception家族的「奋斗史」
CNN模型合集 | 12 Inception(-v4,-ResNet-v1,-ResNet-v2)
基于PyTorch实现Inception-v4, Inception-ResNet亲身实践
InceptionResNet框架主要分stem-block、Inception-resnet-A、B、C block四部分。
Inception ResNet 有两个子版本:v1 和 v2。这两个子版本之间有微小差异。
- Inception-ResNet v1 的计算成本和 Inception v3 的接近。
- Inception-ResNetv2 的计算成本和 Inception v4 的接近。
- 它们有不同的 stem,正如 Inception v4 部分所展示的。
- 两个子版本都有相同的模块 A、B、C 和缩减块结构。唯一的不同在于超参数设置。在这一部分,我们将聚焦于结构,并参考论文中的相同超参数设置(图像是关于 Inception-ResNet v1 的)。
简单来说,Inception V4与Inception V3相比主要是对inception结构前的常规conv-pooling结果进行了改进,并加深了网络。然后将Inception V3与V4分别与ResNet结合,得到了Inception-ResNet-v1和v2。
ResNeXt-2017年
Facebook何恺明团队。
Inception(split-transform-merge策略,即提高宽度来提高网络性能)那边把ResNet拿来搞了Inception-ResNet,这头ResNet也把Inception拿来搞了一个ResNeXt,主要就是单路卷积变成多个支路的多路卷积,不过分组很多,结构一致,进行分组卷积。
ResNext不需要人工设计复杂的Inception结构细节,而是每一个分支都采用相同的拓扑结构。ResNeXt的本质是分组卷积(Group Convolution),通过变量基数(Cardinality)来控制组的数量,基数C对于结果的影响比宽度和深度更加重要。
深度学习——分类之ResNeXt
薰风读论文:ResNeXt 深入解读与模型实现
PyTorch实现ResNeXt亲身实践
如下图,左边是ResNet的基本结构,右边是ResNeXt的基本结构:
左边是Inception,右边是ResNext
ResNeXt本质上是在简化Inception中添加一条short-cut。
ResNeXt的思想是源自Inception,不同于Inception的需要人工设计每个分支,ResNeXt的每个分支的拓扑结构是相同的。最后再结合残差网络,得到的便是最终的ResNeXt。
得益于精心设计的复杂的网络结构,ResNet-Inception v2可能效果会更好一点,但是ResNeXt的网络结构更简单,可以防止对于特定数据集的过拟合。
a是ResNeXt基本单元,如果把输出那里的1x1合并到一起,得到等价网络b拥有和Inception-ResNet相似的结构,而进一步把输入的1x1也合并到一起,得到等价网络c则和通道分组卷积的网络有相似的结构。
作者相当于在说,Inception-ResNet和通道分组卷积网络,都只是ResNeXt这一范式的特殊形式而已,进一步说明了split-transform-merge的普遍性和有效性,以及抽象程度更高,更本质一点。
DenseNet-2017年
DenseNet的核心思想就是在每一层上都加上一个单独的shortcut,使得任意两层都能直接连通。
DenseNet建立的是前面所有层与后面层的密集连接(dense connection),另一大特色是通过特征在channel上的连接来实现特征重用(feature reuse)。这些特点让DenseNet在参数和计算成本更少的情形下实现比ResNet更优的性能,DenseNet也因此斩获CVPR 2017的最佳论文奖。
- DenseBlock:密集连接,特征重用。
- Transition:连接两个相邻的DenseBlock,并且降低特征图大小,压缩模型。
DenseNet:比ResNet更优的CNN模型
PyTorch实现DenseNet亲身实践
图1 ResNet网络的短路连接机制(其中+代表的是元素级相加操作)
图2 DenseNet网络的密集连接机制(其中c代表的是channel级连接操作)
图3 DenseNet的前向过程
DenseNet的网络结构主要由DenseBlock和Transition组成,其中DenseBlock是包含很多层的模块,每个层的特征图大小相同,层与层之间采用密集连接方式。而Transition模块是连接两个相邻的DenseBlock,并且通过Pooling使特征图大小降低。图4给出了DenseNet的网路结构,它共包含4个DenseBlock,各个DenseBlock之间通过Transition连接在一起。
图4 使用DenseBlock+Transition的DenseNet网络
图6 DenseNet的网络结构
由于后面层的输入会非常大,DenseBlock内部可以采用bottleneck层来减少计算量,主要是原有的BN+ReLU+3x3 Conv结构中增加1x1 Conv,如图7所示,即BN+ReLU+1x1 Conv+BN+ReLU+3x3 Conv,称为DenseNet-B结构。其中1x1 Conv得到 [公式] 个特征图它起到的作用是降低特征数量,从而提升计算效率。
图7 使用bottleneck层的DenseBlock结构
对于Transition层,它主要是连接两个相邻的DenseBlock,并且降低特征图大小。Transition层包括一个1x1的卷积和2x2的AvgPooling,结构为BN+ReLU+1x1 Conv+2x2 AvgPooling。另外,Transition层可以起到压缩模型的作用。
基于该block结构构件的DenseNet具有以下的优点:
- 进一步缓解了梯度消失的问题;
- 利用这种密集结构强化了特征传递的过程;
- 促进了不同层之间特征的融合;
- 将k设置得较小即可实现很好的性能,显著减少了网络的参数量。
DPN-2017年
2017年ILSVRC物体检测的冠军。
作者用High Order RNN结构(HORNN)把DenseNet和ResNet联系到了一起,证明了DenseNet能从靠前的层级中提取到新的特征,而ResNet本质上是对之前层级中已提取特征的复用。通过把这两种结构的优点结合到一起,就有了最新结构Dual Path Networks(DPN)。
ResNet提取的特征中冗余度比较低,DenseNet提取的特征冗余度高。一个有高复用率,但冗余度低;一个能创造新特征,但冗余度高,如果把这两种结构结合起来,就能发挥更大的威力,这就有了DPN。
通过High Order RNN(HORNN)高阶循环卷积网络,将ResNet和DenseNet进行了融合,所谓的dual path,即一条path是ResNet,另一条path是DenseNet。论文的Motivation是通过对ResNet和DenseNet的分解,证明了ResNet更侧重于特征的复用,而DenseNet则更侧重于特征的生成,通过分析两个模型的优劣,将两个模型有针对性的组合起来,提出了DPN。
解读Dual Path Networks(DPN,原创)
DPN详解(Dual Path Networks)
PyTorch实现DPN亲身实践
DPN结构
MobileNet V1-2017年
2017年4月,谷歌提出MobileNetV1,这一专注于在移动设备上的轻量级神经网络。MobileNet可谓是轻量级网络中的Inception,经历了一代又一代的更新。成为了学习轻量级网络的必经之路。
MobileNetV1就是把VGG中的标准卷积层换成深度可分离卷积就可以了。
深度可分离卷积就是将普通卷积拆分成为一个深度卷积和一个逐点卷积。
MobileNetV1将标准卷积分解成一个深度卷积和一个点卷积(1 × 1卷积核),即Depthwise和Pointwise。Depthwise将每个卷积核应用到每一个通道,体现在代码中的group,而Pointwise中1 × 1卷积则用来组合通道卷积的输出。而后,通过一个流线型的架构(堆叠式),都是由深度可分离的卷积模块堆叠的,构成最后的模型。
轻量级神经网络“巡礼”(二)—— MobileNet,从V1到V3
Pytorch:图像分类经典网络_MobileNet(V1、V2、V3)
- 深度卷积
将卷积核拆分成为但单通道形式,在不改变输入特征图像的深度的情况下,对每一通道进行卷积操作,这样就得到了和输入特征图通道数一致的输出特征图。如上图:输入12×12×3的特征图,经过5×5×1×3的深度卷积之后,得到了8×8×3的输出特征图。
- 逐点卷积
逐点卷积就是1×1卷积。主要作用就是对特征图进行升维和降维,如下图:
在深度卷积的过程中,我们得到了8×8×3的输出特征图,我们用256个1×1×3的卷积核对输入特征图进行卷积操作,输出的特征图和标准的卷积操作一样都是8×8×256了。
标准卷积与深度可分离卷积的过程对比如下:
对于通常的3×3的卷积核,使用深度可分离卷积,参数数量和乘加操作的运算量是标准卷积的九分之一到八分之一。
MobileNet的网络结构如上图所示。首先是一个3x3的标准卷积,s2进行下采样。然后就是堆积深度可分离卷积,并且其中的部分深度卷积会利用s2进行下采样。然后采用平均池化层将feature变成1x1,根据预测类别大小加上全连接层,最后是一个softmax层。整个网络有28层,其中深度卷积层有13层。
ShuffleNet-2017年
2017年旷视科技的Xiangyu Zhang,Jian Sun发表,参考MobileNet和ResNeXt,提出了Channel Shuffle来增强分组卷积的全局信息流通。ShuffleNetV1是专门为计算能力有限的移动平台设计。采用两个新操作——逐渐群卷积(pointwise group convolution)和通道混洗(channel shuffle)在保障精确率损失不大的同时大大减少了计算成本。
目前移动端CNN模型主要设计思路主要是两个方面:模型结构设计和模型压缩。ShuffleNet和MobileNet一样属于前者,都是通过设计更高效的网络结构来实现模型变小和变快,而不是对一个训练好的大模型做压缩或者迁移。
Group convolution是将输入层的不同特征图进行分组,然后采用不同的卷积核再对各个组进行卷积,这样会降低卷积的计算量。group convolution之后对channels进行shuffle,但并不是随机的,其实是“均匀地打乱”。
逐点组卷积,就是带分组的卷积核为1×1的卷积,也就是说逐点组卷积是卷积核为1×1的分组卷积。
原因:
1。逐点卷积占了很大的计算量————> pointwise group convolution 逐点分组卷积
2。不同组之间特征通信问题 ————> channel shuffle
轻量级神经网络“巡礼”(一)—— ShuffleNetV2
CNN模型之ShuffleNet
使用channel shuffle后的group convolution
SqueezeNet-2017年
SqueezeNet创新点在于提出了fire module,包括两个部分,squeeze和expand。
SqueezeNet是由若干个Fire模块结合卷积网络中卷积层,降采样层,全连接等层组成的。一个Fire模块由Squeeze部分和Expand部分组成。Squeeze部分是一组连续的卷积组成,Expand部分则是由一组连续的卷积和一组连续的卷积cancatnate组成。
SqueezeNet的设计理念主要有三:
- 尽可能用 [公式] 卷积替代 卷积。
- 输入给 卷积层先进行降维,缩小输入的通道数量,类似ResNet里的BottleNeck设计理念。
- 延迟feature maps的下采样,使得网络前面的层具有较大尺寸的feature maps,有利于提高精度。
下图是SqueezeNet的几个实现,左侧是不加short-cut的SqueezeNet,中间是加了short-cut的,右侧是short-cut跨有不同Feature Map个数的卷积的。
SqueezeNet:小小的模型,多多的快乐! || 5分钟看懂CV顶刊论文
SqueezeNet详解
上图最左的是原生SqueezeNet的结构,而中间和右边都使用了ResNet里的跳层连接,二者不同之处在于右边的模型在跳层连接的两个feature maps尺寸不同时,使用 [公式] 的卷积层使之相同。
SENet-2017年
SENet的全称是Squeeze and Excitation Networks,顾名思义,就是在网络中加入了Squeeze和Excitation操作。
Squeeze通过空间维度压缩特征,在空间上做全局平均池化,每个通道的二维特征变成了一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的通道数相匹配。而Excitation的作用是用两个全连接层和Sigmoid函数得到各通道的权值,第一个全连接层会压缩通道数,减少计算量。该权值与Fscale得到的feature map结合得到最后的结果。
CNN模型合集 | 19 SENet
【论文解读】SENet网络
总流程:X经过一系列传统卷积得到U,对U先做一个Global Average Pooling(Fsq),输出的1x1xC数据再经过两级全连接(Fex),最后用sigmoid限制到[0, 1]的范围,把这个值作为scale乘到U的C个通道上,输入到下级。
MobileNet V2-2018年
轻量级神经网络“巡礼”(二)—— MobileNet,从V1到V3
Mobile V1的深度卷积的卷积核有不少是空,原因是对低维度做ReLU运算,很容易造成信息的丢失。而在高维度进行ReLU运算的话,信息的丢失则会很少。因此将最后一个ReLU6换成线性激活函数。
这个部分称之为linear bottleneck。
深度卷积本身没有改变通道的能力,来的是多少通道输出就是多少通道。如果来的通道很少的话,DW深度卷积只能在低维度上工作,这样效果并不会很好,所以我们要“扩张”通道。既然我们已经知道PW逐点卷积也就是1×1卷积可以用来升维和降维,那就可以在DW深度卷积之前使用PW卷积进行升维(升维倍数为t,t=6),再在一个更高维的空间中进行卷积操作来提取特征。
相比于Mobile V1改进点:
- 深度可分离卷积之前添加了逐点卷积进行升维。
- 添加了残差网络卷积。
- 最后一个ReLU6换成了linear激活i函数。
ShffleNet V2 -2018年
轻量级神经网络“巡礼”(一)—— ShuffleNetV2
ShuffleNetV2:轻量级CNN网络中的桂冠
PyTorch实现ShuffleNet-v2亲身实践
为了改善v1的缺陷,v2版本引入了一种新的运算:channel split。具体来说,在开始时先将输入特征图在通道维度分成两个分支 。左边分支做同等映射,右边的分支包含3个连续的卷积,并且输入和输出通道相同。而且两个1x1卷积不再是组卷积,另外两个分支相当于已经分成两组。两个分支的输出不再是Add元素,而是concat在一起,紧接着是对两个分支concat结果进行channle shuffle,以保证两个分支信息交流。其实concat和channel shuffle可以和下一个模块单元的channel split合成一个元素级运算。
对于下采样模块,不再有channel split,而是每个分支都是直接copy一份输入,每个分支都有stride=2的下采样,最后concat在一起后,特征图空间大小减半,但是通道数翻倍。
从一定程度上说,ShuffleNetv2借鉴了DenseNet网络,把shortcut结构从Add换成了Concat,这实现了特征重用。但是不同于DenseNet,v2并不是密集地concat,而且concat之后有channel shuffle以混合特征,这或许是v2即快又好的一个重要原因。
MobileNet V3 - 2019年
轻量级骨架首选:MobileNetV3完全解析
轻量级神经网络“巡礼”(二)—— MobileNet,从V1到V3
MobileNetV3 参数是由NAS(network architecture search)搜索获取的,又继承的V1和V2的一些实用成果,并引人SE通道注意力机制,可谓集大成者。
主要特点:
- 论文推出两个版本:Large 和 Small,分别适用于不同的场景;
- 使用NetAdapt算法获得卷积核和通道的最佳数量;
- 网络结构搜索中,结合两种技术:资源受限的NAS(platform-aware NAS)与NetAdapt。
- 继承V1的深度可分离卷积;
- 继承V2的具有线性瓶颈的倒残差结构;
- 引入基于squeeze and excitation结构的轻量级注意力模型(SE);
- 使用了一种新的激活函数h-swish(x)代替Relu6,h的意思表示hard;
- 修改了MobileNetV2后端输出head;
EfficientNet-2019年
CNN模型合集 | 25 EfficientNet
谷歌大脑:EfficientNet–阅读笔记
细品EfficientNet
后ResNet时代的顶流EfficientNet
谷歌作者系统的研究了网络深度(Depth)、宽度(Width)和分辨率(resolution)对网络性能的影响,然后提出了一个新的缩放方法–使用简单但高效的复合系数均匀地缩放深度/宽度/分辨率的所有尺寸,在MobileNets 和 ResNet上证明了有效性。同时,使用神经架构搜索来设计新的baseline并进行扩展以获得一系列模型,称EfficientNets,比之前的ConvNets更accuracy和更efficiency。
复合模型扩展:
(a)为基线网络;(b)为增大宽度w的方式扩展网络;©为增大网络深度d;(d)为增大分辨率r;(e)为综合3个维度的复合模型扩展。
核心思想:
- 提出了复合模型扩展(compound model scaling)算法,来综合优化网络宽度(通道,卷积核个数)、深度、分辨率。
- 通过优化复合系数Φ和3个维度扩展参数d w r(也用α β γ的Φ指数表示),来最大化Accuracy(N(d,w,r))
- 提出参数的两步优化法,先找出最优α β γ,再增大Φ来提高精度
- EfficientNet使用了MBConv模块
- 复合模型扩展算法同样适用于其他网络结构,精度不变下参数和计算量大减
GhostNet-2019年
华为为了去除特征图中的冗余,减少计算成本,提出Ghost Module。将原始卷积层分为两部分,首先使用较少的卷积核来生成原始特征图,然后,进一步使用cheap operations以高效生产更多ghost feature map。
GhostNet由以Ghost modules为基础的Ghost Bottlenecks构成。
超越谷歌MobileNet!华为提出端侧神经网络架构GhostNet|已开源
GhostNet 解读及代码实验(附代码、超参、日志和预训练模型)
Ghost Module则分为两步操作来获得与普通卷积一样数量的特征图。
第一步:少量卷积(比如正常用32个卷积核,这里就用16个,从而减少一半的计算量)
第二步:cheap operations,如图中的Φ表示,从问题3中可知,Φ是诸如3*3的卷积,并且是逐个特征图的进行卷积(Depth-wise convolutional)。
Ghost Bottlenecks结构:
Ghost Module是一个即插即用模块,可以无缝衔接现有的CNN中。
采用Ghost Module组成的Ghost bottlenecks,设计出Ghost Net。
结构与ResNet的是类似的,并且与mobilenet-v2一样在第二个module之后不采用ReLU激活函数。
左边是stride=1的Ghost Bottlenecks,右边是stride=2的Ghost Bottlenecks,目的是为了缩减特征图大小。
Ghost Net结构:
Ghost Net结构与MobileNet-V3类似,并且用了SE结构。
CSPNet-2019年
Cross Stage Partial Network(CSPNet)就是从网络结构设计的角度来解决以往工作在推理过程中需要很大计算量的问题。作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的,也就是冗余梯度信息。
CSPNet全称是Cross Stage Partial Network跨阶段局部网络,主要概念是通过分割梯度流使梯度流通过不同的网络路径传播,具体实现是通过将基本层的特征图分成两部分,然后通过一个跨阶段的层次结构合并它们来实现的。作者也设计了两种特征融合的策略,Fustion First,Fusion Last。
CSPNet是一种处理的思想,可以和ResNet、ResNeXt和DenseNet结合。
CSPNet 论文笔记
增强CNN学习能力的Backbone:CSPNet
CSPNet——PyTorch实现CSPDenseNet和CSPResNeXt
上图是DenseNet的示意图以及CSPDenseNet的改进,改进点在于CSPNet将浅层特征映射为两个部分,一部分经过Dense模块(图中的Partial Dense Block),另一部分直接与Partial Dense Block输出进行concate。
Fustion First的方式是对两个分支的feature map先进行concatenation操作,这样梯度信息可以被重用。
Fusion Last的方式是对Dense Block所在分支先进性transition操作,然后再进行concatenation, 梯度信息将被截断,因此不会重复使用梯度信息 。
CSPDarkNet53-2020年
CSP-DarkNet,沿用网络的滤波器尺寸和整体结构,在每组Residual block加上一个Cross Stage Partial结构。并且,CSP-DarkNet中也取消了Bottleneck的结构,减少了参数使其更容易训练。激活函数采用mish。
YOLOv4特征提取网络——CSPDarkNet结构解析及PyTorch实现
上图为Mish的曲线。首先其和ReLU一样,都是无正向边界的,可以避免梯度饱和;其次Mish函数是处处光滑的,并且在绝对值较小的负值区域允许一些负值。
RepVGG-2021年
RepVGG:极简架构,SOTA性能,让VGG式模型再次伟大(CVPR-2021)
RepVGG:VGG,永远的神! | CVPR 2021
RepVGG 对比 Mobilenet、shufflenet等网络的优势有哪些?
图解RepVGG
RepVGG在训练时使用高精度的多分支网络学习权值,在推理时使用低延迟的单分支网络,然后通过结构重参数化将多分支网络的权值转移到单分支网络。训练时采用多分支网络,而推理时仍然使用单分支网络,通过新颖的结构性重参数化(structural re-parameterization)将多分支网络的权值转移到简单网络中。
单路极简直筒型架构,一路3x3卷积接ReLU。
RepVGG模型的基本架构:将20多层3x3卷积堆起来,分成5个stage,每个stage的第一层是stride=2的降采样,每个卷积层用ReLU作为激活函数。