算法工程师面试面经 | 经典分类网络与发展

专栏地址:http://t.csdnimg.cn/HAbwF

pipeline:LeNet-5->AlexNet->Network in Network->VGGNet->GoogLeNet->ResNet->Inception->DenseNet->Inception->MobileNet->ShffleNet->SENet

4.1 AlexNet

AlexNet模型有以下特点:

1. 所有卷积层都使用ReLU作为非线性映射函数,使模型收敛速度更快

2. 在多个GPU上进行模型训练,不但可以提高模型的训练速度,还能提升数据的使用规模

3. 使用LRN对局部特征进行归一化,结果作为ReLU激活函数的输入能有效降低错误率

4. 重叠最大池化(Overlapping max pooling),即池化范围z与步长s存在关系z > s ,避免平均池化(Average pooling)的平均效应

5. 使用随机丢弃技术(Dropout)选择性地忽略训练中的单个神经元,避免模型的过拟合

4.2 VGGNet

VGGNet有以下特点:

1. 整个网络使用同样大小的卷积核尺寸3 ×3和最大池化尺寸2 × 2 。

2. 1 × 1卷积的意义主要在于线性变换,没有发生降维。

3. 两个3 × 3 的卷积层串联相当于1个5 × 5 的卷积层。同样地,3个3 × 3 的卷积层串联效果相当于1个7 × 7 的卷积层。使得网络参数量更小,而且多层的激活函数使网络对特征学习能力更强。

4. VGGNet先训练浅层的的简单网络,再复用该权重来初始化更深层网络,如此反复训练并初始化VGG,能够使训练时收敛的速度更快。

5. 使用多尺度的变换对原始数据做数据增强,使得模型不易过拟合

4.3 GoogLeNet

GoogLeNet与VGG不同,该网络主要工作是探索了增加网络的宽度。论文提出了名为Inception 的结构来实现既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。

GoogLeNet有以下特点:

1. 提出了Inception 结构   2. 任意nxn的卷积都可以通过1xn卷积后接nx1卷积来替代。实际上,作者发现在网络的前期使用这种分解效果并不好,还有在中度大小的feature map上使用效果才会更好。   3. 挖掘了网络宽度可以降低网络计算量同时表现优异。GoogLeNet的计算效率明显高于VGGNet,大约只有500万参数,只相当于Alexnet的1/12(GoogLeNet的caffe model大约50M,VGGNet的caffe model则要超过600M)。   4. Average pooling代替全连接层,有效减少参数   5. 探索了1x1卷积的作用,用于升维和降维信息。

Inception

Inception_v1

输入被拷贝四份,在四条路径上进行传递。特点如下:

采用大小不同的三种卷积核使得感受野大小不同,得到不同尺度的特征。

使用1*1卷积核降低维度,减少计算瓶颈,增加网络层数,提高非线性。

视觉信息在不同尺度上进行处理聚合,这样下一步可以从不同尺度提取特征。

“Inception的作用就是替代了人工确定卷积层中过滤器的类型或者是否创建卷积层和池化层,让网络自己学习它具体需要什么参数。”

Inception_v2

把Inception-v1中5 ∗ 5 的卷积用2个3 ∗ 3的卷积替换,保持相同感受野的同时减少参数,加强非线性的表达能力。

提出了Batch Normalization,如果激活函数是sigmoid,对于每个神经元,可以把逐渐向非线性映射的两端饱和区靠拢的输入分布,强行拉回到0均值单位方差的标准正态分布,即激活函数的兴奋区,在sigmoid兴奋区梯度大,即加速网络训练,还防止了梯度消失。

Inception_v3

分解卷积核尺寸。一个是分解为对称的小的卷积核,即5 ∗ 5 的卷积核替换成2个3 ∗ 3 的卷积核。另一个是分解为不对称的卷积核,即将n ∗ n 的卷积核替换成1 ∗ n 和 n ∗ 1 的卷积核堆叠。

上述结构使得:1. 降低计算量,2. 增加一层非线性,3. 可以处理更丰富的空间特征,增加特征的多样性。

改变降低特征图尺寸的方式。分卷积通道与池化通道。

Inception-v4 最大特点是与Resnet进行结合。

4.4 ResNet

​ 从VGG与GoogLeNet诞生后,实验研究发现深度CNN网络达到一定深度后再一味地增加层数并不能带来进一步地分类性能提高,反而会招致网络收敛变得更慢,分类准确率也变得更差。排除数据集过小带来的模型过拟合等问题后,发现过深的网络仍然还会使分类准确度下降。​ ResNet作者提出可能是因为更深的网络会伴随梯度消失/爆炸问题,从而阻碍网络的收敛。这种加深网络深度但网络性能却下降的现象被称为退化问题。于是ResNet提出了res-block结构,对于更深层次的模型:添加恒等映射(identity mapping)(就是跳跃结构,直接把信息恒等传递到下一层)。在这种情况下,更深的模型不应该产生比其对应的较浅的网络更高的训练误差。

原先网络输入x,希望输出H(x)。令H(x)=F(x)+x,网络只需学习输出一个残差F(x)=H(x)-x。当残差为0时,此时堆积层仅仅做了恒等映射,实际上残差不会为0,使得堆积层在输入特征基础上学习新的特征从而拥有更好性能。简化了学习过程,增强了梯度传播。

4.5 DenseNet

论文中提出的架构为了确保网络层之间的最大信息流,将所有层直接彼此连接。为了保持前馈特性,每个层从前面的所有层获得额外的输入,并将自己的特征映射传递到后面的所有层。该论文基于这个观察提出了以前馈的方式将每个层与其他层连接的密集卷积网络(DenseNet) DenseNet 是一种具有密集连接的卷积神经网络。在该网络中,任何两层之间都有直接的连接,也就是说,网络每一层的输入都是前面所有层输出的并集,而该层所学习的特征图也会被直接传给其后面所有层作为输入。

DenseNet有以下特点:

1.相比ResNet 拥有更少的参数数量

2.旁路加强了特征的重用

3.网络更易于训练,并具有一定的正则效果

4.缓解了梯度消失(gradient vanishing)和模型退化(model degradation)的问题

4.6 MobileNet

MobileNet V1

谷歌在2017年提出,专注于移动端或者嵌入式设备中的轻量级CNN网络。  该论文最大的创新点是,提出了深度可分离卷积(depthwise separable convolution)。【DW卷积】  使用RELU6作为激活函数,这个激活函数在float16/int8的嵌入式设备中效果很好,能较好地保持网络的鲁棒性。

MobileNet V2

时隔一年,谷歌的又一力作。V2在V1的基础上,主要解决了V1在训练过程中非常容易特征退化的问题,引入了Inverted Residuals和Linear Bottlenecks。  所谓倒置残差块,如图所示,与残差块做对比。

残差块是先降维再升维,两头胖,中间瘦。倒残差结构就是 两头瘦,中间胖;Linear Bottlenecks:在V1中 depthwise 中有0卷积的原因就是 Relu 造成的,换成 Linear 解决了这个问题;

MobileNet V3

v3版本结合了v1的深度可分离卷积、v2的Inverted Residuals和Linear Bottleneck、SE模块,提出了h-switch作为激活函数,利用NAS(神经结构搜索)来搜索网络的配置和参数(NAS就是不需要人工调参,自动搜索,要先给出搜索空间和搜索方式)。

4.7 ShuffleNet

ShuffleNet是Face++提出的一种轻量化网络结构,主要思路是使用Group convolution和Channel shuffle改进ResNet,可以看作是ResNet的压缩版本。

Channel Shuffle ShuffleNet的本质是将卷积运算限制在每个Group内,这样模型的计算量取得了显著的下降。然而导致模型的信息流限制在各个Group内,组与组之间没有信息交换,如图1(a),这会影响模型的表示能力。因此,需要引入组间信息交换的机制,即Channel Shuffle操作。同时Channel Shuffle是可导的,可以实现end-to-end一次性训练网络。

4.8 SENet(ImageNet最后一届竞赛的冠军,提出了SE结构)

对于CNN网络来说,核心计算是卷积算子,通过卷积核从输入特征图学习到新特征图。从本质上讲,卷积是对一个局部区域进行特征融合,这包括空间上(H和W维度)以及通道间(C维度)的特征融合。

对于卷积操作,很大一部分改进工作是提高感受野,即空间上融合更多特征,或者是提取多尺度空间信息,如Inception网络的多分支结构。对于channel维度的特征融合,卷积操作基本上默认对输入特征图的所有channel进行融合。而MobileNet网络中的组卷积(Group Convolution)和深度可分离卷积(Depthwise Separable Convolution)对channel进行分组也主要是为了使模型更加轻量级,减少计算量。SENet网络的创新点在于关注channel之间的关系,希望模型可以自动学习到不同channel特征的重要程度。为此,SENet提出了Squeeze-and-Excitation (SE)模块,如下图所示

SE模块首先对卷积得到的特征图进行Squeeze操作,得到channel级的全局特征(SENet提出Squeeze操作,将一个channel上整个空间特征编码为一个全局特征,采用global average pooling来实现),然后对全局特征进行Excitation操作(这里采用sigmoid形式的gating机制),学习各channel间的关系,得到不同channel的权重,最后乘以原来的特征图得到最终特征。本质上,SE模块是在channel维度上做attention或者gating操作,这种注意力机制让模型可以更加关注信息量最大的channel特征,而抑制不重要的channel特征。另外一点是SE模块是通用的,意味着其可以嵌入到现有的网络架构中。

4.9 [EfficientNet]([1905.11946] EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks (arxiv.org))

width_coefficient代表channel维度上的倍率因子,比如在 EfficientNetB0中Stage1的3x3卷积层所使用的卷积 核个数是32,那么在B6中就是 32 × 1.8 = 57.6接着取整到离它最近的8的整数倍即56,其它Stage同理

depth_coefficient代表depth维度上的倍率因子(仅针对Stage2到Stage8),比如在EfficientNetB0中Stage7的 L = 4 ,那么在B6中就是 4 × 2.6 = 10.4,接着向上取整即11.

#25届机械人秋招该做哪些准备?##25届暑期实习[话题]##25秋招##25届暑期实习##秋招#
全部评论
加油 gogogo
点赞 回复 分享
发布于 05-06 19:37 北京

相关推荐

秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++ & Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
评论
9
30
分享
牛客网
牛客企业服务