这一章我们一起来梳理一下深度学习中图像分类相关的算法。
推荐一个B站上讲解图像分类相关算法的很好的视频:https://space.bilibili.com/18161609/channel/detail?cid=97304&ctype=0
AlexNet网络结构比较简单,也是比较早期的模型,上图中分成两个路线,其实是利用两块GPU分别进行运行,只在特定的网络层才存在两者之间的交互,实质我们可以简化一下,只看其中一条路线。网络总共的层数为8层,5层卷积,3层全连接层。
这个网络的主要特点为:
1、使用relu激活函数,而不是sigmoid或者tanh,
这些饱和的非线性函数在计算梯度的时候都要比非饱和的现行函数2、f(x)=max(0,x)慢很多,在这里称为 Rectified Linear Units(ReLUs)。在深度学习中使用ReLUs要比等价的tanh快很多。
2、使用了LRN局部响应归一化,我们用激活函数将神经网络的输出增加非线性表达能力,tanh和sigmoid这些传统的激活函数的值域都是有范围的,但是ReLU激活函数得到的值域没有一个区间,所以要对ReLU得到的结果进行归一化。不过现在我们使用的batch normalization或者layer normalization等归一化方法效果要更好,所以这里我们不对LRN展开说明。
3、在全连接的前两层使用dropout来减少过拟合。
算法详情链接:https://blog.csdn.net/luoluonuoyasuolong/article/details/81750190
VGG网络是2014年提出的,在Alexnet之后,其主要的改进点为:采用连续的几个3x3的卷积核代替AlexNet中的较大卷积核(11x11,7x7,5x5)。对于给定的感受野(与输出有关的输入图片的局部大小),采用堆积的小卷积核是优于采用大的卷积核,因为多层非线性层可以增加网络深度来保证学习更复杂的模式,而且代价还比较小(参数更少)。
关于感受野的解释,可见下图:
网络结构:
算法详情链接:https://zhuanlan.zhihu.com/p/41423739
GoogLeNet也是14年提出的网络,其主要特点为:
1、引入Inception结构,融合不同尺度的特征信息,其结构如下图:
注意这里每个分支的输出结构要一致,最后才可以拼接。
2、使用1x1的卷积核进行降维以及映射处理。
3、添加两个辅助分类器帮助训练。
4、丢弃全连接层,使用平均池化层,大大减少了模型参数。
GoogLeNet的参数量约为VGG的1/20。
算法详情链接:https://blog.csdn.net/qq_31531635/article/details/72232651
1、提出residual模块,其主要思想为残差连接,主要用于解决网络退化问题,退化区别与梯度爆炸和梯度消失,其指的是随着网络深度加深而导致的网络效果下降。结构如下图:
2、超深的网络结构(突破1000层)。
3、使用了Batch normalization 加速训练。BN相关的内容可以参考我的另外一个文章:https://blog.csdn.net/mingzheng114/article/details/115982134?spm=1001.2014.3001.5501
算法详情链接:https://www.cnblogs.com/shine-lee/p/12363488.html
MobileNet是google在2017年提出的,专注于移动端设备推理的网络,相对于传统卷积神经网络,在准确率小幅下降的情况下大大减少了参数量和运算量(相对于VGG16准确率下降了0.9%,但是参数量仅为其1/32),其主要特点为:
1、使用了深度可分卷积,即DW卷积和PW卷积,大大减少了参数量和运算量。
2、引入了超参数a,β,α参数是一个倍率因子,用来调整卷积核的个数,β是控制输入网络的图像尺寸参数
v2版本的模型是18年提出的,相对于v1准确率更高,参数量更少,其主要特点为:
1、Inverted Residuals(倒残差结构)
在残差结构中是1x1卷积降维->3x3卷积->1x1卷积升维,在倒残差结构中正好相反,是1x1卷积升维->3x3DW卷积->1x1卷积降维。为什么要这样做,原文的解释是高维信息通过ReLU激活函数后丢失的信息更少(注意倒残差结构中基本使用的都是ReLU6激活函数,但是最后一个1x1的卷积层使用的是线性激活函数)
注意所有的参加结构,都要求输出和输入具有相同的shape
2、Linear Bottlenecks
Bottleneck指的就是一个倒残差结构组成的块,网络使用了多个bottlenect线性堆叠。
算法详情链接:https://blog.csdn.net/binlin199012/article/details/107155719/?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-1.base&spm=1001.2101.3001.4242
mobilnet是19年提出的网络,其特点为:
1、更新了bneck。
2、引入了SE结构。
3、更新了激活函数,利用h-swish代替swish函数。
第一列Input代表mobilenetV3每个特征层的shape变化;
第二列Operator代表每次特征层即将经历的block结构,我们可以看到在MobileNetV3中,特征提取经过了许多的bneck结构;
第三、四列分别代表了bneck内逆残差结构上升后的通道数、输入到bneck时特征层的通道数。
第五列SE代表了是否在这一层引入注意力机制。
第六列NL代表了激活函数的种类,HS代表h-swish,RE代表RELU。
第七列s代表了每一次block结构所用的步长。
bneck结构如下:
SE结构:轻量级的注意力模型。
这个注意力机制的作用方式是调整每个通道的权重。
算法详情链接:https://blog.csdn.net/binlin199012/article/details/107155719/?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-1.base&spm=1001.2101.3001.4242
ShuffleNet是旷视科技最近提出的一种计算高效的CNN模型,其和MobileNet一样主要是想应用在移动端,ShuffleNet的核心设计理念是对不同的channels进行shuffle来解决group convolution带来的弊端。
ShuffleNet的基本单元是在一个残差单元的基础上改进而成的。如图2-a所示,这是一个包含3层的残差单元:首先是1x1卷积,然后是3x3的depthwise convolution(DWConv,主要是为了降低计算量),这里的3x3卷积是瓶颈层(bottleneck),紧接着是1x1卷积,最后是一个短路连接,将输入直接加到输出上。现在,进行如下的改进:将密集的1x1卷积替换成1x1的group convolution,不过在第一个1x1卷积之后增加了一个channel shuffle操作。值得注意的是3x3卷积后面没有增加channel shuffle,按paper的意思,对于这样一个残差单元,一个channel shuffle操作是足够了。还有就是3x3的depthwise convolution之后没有使用ReLU激活函数。改进之后如图2-b所示。对于残差单元,如果stride=1时,此时输入与输出shape一致可以直接相加,而当stride=2时,通道数增加,而特征图大小减小,此时输入与输出不匹配。一般情况下可以采用一个1x1卷积将输入映射成和输出一样的shape。但是在ShuffleNet中,却采用了不一样的策略,如图2-c所示:对原输入采用stride=2的3x3 avg pool,这样得到和输出一样大小的特征图,然后将得到特征图与输出进行连接(concat),而不是相加。这样做的目的主要是降低计算量与参数大小。
算法详情链接:https://zhuanlan.zhihu.com/p/32304419
EfficientNet主要探索了网络输入的分辨率,网络深度和宽度对于最终性能的影响,这里不详细说,可以直接查看对应的算法详情链接。
算法详情链接:https://blog.csdn.net/qq_43258953/article/details/103092615
vision Transformer是20年的文章,其主要利用transformer来做图像相关任务。
图片的序列则是由一张图片切成多个patch得到,现将图片进行分块,切分后进行展平,将每个图像块展平为一维向量,比如得到的小块为长P宽P通道C的,展平后则为P*P*C。shape的变化是,其中.在代码中是一句话的事情,用了einops这个库。
x = einops.rearrange(img, 'b c (h p1) (w p2) -> b (h w) (p1 p2 c)', p1 = p, p2 = p)
算法详情链接:https://zhuanlan.zhihu.com/p/273652295