深度学习-卷积神经网络-算法比较
AlexNet网络
①因为把数据序列化后可以组成矩阵,用矩阵乘法形式进行处理并学习
AlexNet网络的前几层主要是做了加深通道,和池化层。并且每一次加深,feature map的尺寸都会减小,其padding也不是固定的
后两层卷积feature map的尺寸以及通道数并没有改变
LRN(局部归一化) 是将 通道上该点的像素值走一个归一化处理
GoogleNet网络
- 网络亮点
-
引入了Inception结构(融合不同尺度的特征信息)
- 使用1×1的卷积核进行降维以及映射
- 降低维度,减少参数。总参数是VGG的1/20,但搭建不如VGG方便
- 添加两个辅助分类器辅助训练(就是有三个输出层,AlexNet、VGG都是一个输出层)
- 辅助分类器相当于对模型做了融合,同时给网络增加了反向传播的梯度信号,在一定程度上提供了正则化的作用。
- 只是在训练的时候有用,在测试的时候丢弃
- 丢弃全连接层,使用平均池化层(大幅减少模型参数)
-
池化输出的feature尺寸计算方法:其中F是池化的大小,P是padding,S是stride
ResNet网络
主要解决两个问题:
-
梯度消失或者梯度爆炸
解决:
-
对数据标准化处理batchnormlization
把每个feature map调整为均值为0,方差为1的分布规律
是指一批数据的同一个通道
-
对权重初始化
-
-
退化问题
解决:
- 利用残差结构
对于浅层网络,不需要对数据进行降维再卷积,深层网络或者通道数较高的网络需要先用1×1的卷积核进行降维,然后再进行卷积操作升维
每个阶段第一个block的shortcut是虚线的原因?
因为每个阶段输入输出feature map的尺寸以及通道数不同,因此在每个阶段的第一层需要先改变feature map的尺寸(通过stride=2进行缩小尺寸)以及通道数
每个阶段的feature map均被每个阶段的第一个block进行缩小
MobileNet网络结构
-
MobileNetV1:我们找到了一个叫深度可分离卷积的东西,发现很好用
- 深度可分离卷积: DW 和 PW 组合替换常规卷积来达到减少参数数量的目的
- 超参数: 改变输入输出通道数α和特征尺寸
劣势:部分卷积核训练出的参数值为0
-
MobileNetV2:发现MobileNetV1的缺陷,然后发明了inverted residual with linear bottleneck 的block替代,效果和性能都更好
-
比v1网络参数量更小,准确率更高
-
线性瓶颈结构
-
逆向残差结构bottleneckD
常规残差,两头大,中间小(先用1×1的卷积核降维处理,再用3×3的卷积核学习,最后用1×1的卷积核去升维)
逆向残差,两头小,中间大(先用1×1的卷积核升维处理,再用3×3的卷积核学习,最后用1×1的卷积核去降维)
升维后再进行卷积操作会不会导致计算量过大?不会,因为一个深度卷积核只对特征层一个通道进行,所以计算量不会过高。此外升维后还能提取更多的特征。
t c n stride 扩展因子 bottleneck输出矩阵的通道数 bottleneck重复的次数 每个block第一层的bottleneck的步距长度 倒残差结构中扩展的倍率 一个block可能会由多个bottleneck组成
-
-
MobileNetV3:用NAS搜到一个网络结构,在此基础上稍作修改
-
更新block结构(命名为bneck)
-
h-swish 激活函数
由于非线性激活函数swish x=x*sigmoid(x)计算较为复杂,尤其求导过程更为困难
提出h-swish激活函数用x×hard-sigmoid激活函数
-
SENet 结构(注意力机制)
-
-
使用NAS搜索参数(neutal Architecture Search)
-
重新设计耗时层结构
网络结构
-
其中每个block(bneck)详细结构为
激活函数
-
swish激活函数
-
-
新的激活函数(hard-swish): h-swish 是基于 swish 激活函数的改进,所以先了解一下 swish, swish 具备无上届有下界、平滑、非单调的特性。并且 swish 在深层模型上的效果优于 ReLU
采用RELU6主要是为了在移动端float16的低精度的时候,也能有很好的数值分辨率,如果对ReLu的输出值不加限制,那么输出范围就是0到正无穷,而低精度的float16无法精确描述其数值,带来精度损失。
通道注意力
引入SENet 引入轻量级注意力机制网络,通过压缩、激励、给不同层权重
SE代表的是Squeeze-and-Excitation这两个阶段
-
Squeeze阶段
①:对输入进行一个全局平均池化,即对每个通道均计算均值
②:两个全连接层进行训练,利用倒置残差(Inverted Residuals)
2.Excitation阶段
①:经过第一个全连接层squeeze降维后,经激活函数再进行第二全连接层excitation升维
改进
将通道注意力改为通道与空间结合的混合注意力算法(CBAM),此外对每个通道还乘以每个通道的熵值
ShuffleNet网络
shuffleNet这篇论文除了提出ShuffleChannel思想外,更像是一种模型推理效率的证明。不用的groupconv,以及不同的串并联结构,对flops以及mac的影响
ShuffleChannel思想(通道重排操作):
把分组卷积的每个组的对应通道进行重组合,联系各个通道之间的关系
计算量比较
先通过1×1的分组卷积,然后进行channel shuffle再进行深度可分离卷积再用1×1的分组卷积回复通道数
下图分别是ShuffleNetv1的stride为1、2的版本和ShuffleNetv2 stride为1、2的版本
当不用分组卷积的时候就没有用channel shuffle的必要了
提出的四点推理效率证明:
-
要使用平衡的convolutions,使输出channal与输入channel尽可能相等
-
\[ 设hw为特征图的空间大小,则1×1的 conv 的计算量FLOPs为hwc_1c_2。\\存储访问成本为 MAC=hw(c_1+c_2)+c_1c_2\\ 从均值不等式,可以得到 \text{MAC}\geq2\sqrt{hwB}+\frac{B}{hw}.所以当输入c_1c_2相等时,能达到下限 \]
-
大量的分组卷积数量会增加存储访问 (Group 计算成本,虽然增大group数,能降低flops,甚至提高acc,但是会降低推理速度)
-
网络分支过多会降低其并行化程度,尤其是GPU上的并行速度 (并行结构与串行结构比较)
-
element-wise(对每个元素操作的)操作带来的影响是不可忽视的
比如①因为把数据序列化后可以组成矩阵,用矩阵乘法形式进行处理并学习
- Relu
- addtensor
- addbias
对flops影响很小,但对MAC有一定影响
轻量化网络总结
ShuffleNet与MobileNet
-
ShuffleNet
- 适用于对模型大小和计算量有较高要求的场景
- 分组卷积可以减少计算量和参数量。
- 均值池化代替全连接层可以减少模型参数的数量。
- 通道重排操作可以增加特征的多样性,提高模型的表达能力。
- 适用于对模型大小和计算量有较高要求的场景
-
而MobileNet则更适用于对模型速度和准确性有较高要求的场景
- 有SE模块
- 相比shufflenet网络复杂一些,稍慢,但准确率高
- 有倒残差结构