卷积神经网络CNN 常用模型_cnn模型-程序员宅基地

技术标签: 卷积神经网络  深度学习与自然语言处理  

一、CNN 简介

CNN的精华是:三概念两核心,这里做个简要的概要性介绍。

1、CNN 两核心——卷积和池化

(1)卷积

主要起到作用是抽取特征,使网络具有一定转移不变性,也有一定降维的作用。概述:设定一个n行m列的卷积窗口,采用的relu(elu,leakyrelu)做为激活函数函数,对输入X进行卷积操作。
注意:卷积可能单通道或者多通道卷积;积操作时分为 padding 和非 padding 两种方式,padding 也分为很多方式,比如zero-padding,mean-padding等;对同一个输入可以设置不同大小卷积和,或从不同的位置,或不同的卷积步长多次进行卷积,目的就是为了尽可能多的抽取特征。

(2)池化

主要起降维的作用。概述:设置一个n行m列的池化窗口,对输入X进行池化操作,采用relu(elu,leakyrelu)做为激活函数。也可采用sigmoid或tans型激活函数,但注意函数的饱和死区特性导致的反向传播时的梯度消失问题,可以配合Batch Normalization使用。池化也有很多方式,比如最大值池化、平均值池化。

2、CNN 三概念——局部感受野、权值共享和下采样/降采样

(1)局部感受野:卷积操作时卷积窗口与输入X重合的部分。

(2)权值共享:卷积操作或池化操作时,卷积窗口或池化窗口的权值不发生变化。

(3)下采样/降采样:就是池化操作。

可见,卷积和池化的随机组合赋予了CNN很大的灵活性,因此也诞生了很多耳熟能详的经典网络:AlexNet,VGGNet,Google Inception Net,ResNet,四种网络在深度和复杂度方面一次递增。AlexNet获得了ILSVRC(ImageNet Large Scale Visual Recognition Challenge)比赛2012年冠军(8层神经网络,top-5错误率16%,使用更多额外数据可达到15.3%),VGGNet获得2014年ILSVRC的亚军(19层神经网络,top-5错误率7.3%),Google Inception Net获得2014年ILSVRC冠军(22层神经网络,top-5错误率6.7%),ResNet获得2015年冠军(top-5错误率3.57%,152层神经网络)。

3、1x1 卷积核的作用

(1)灵活的控制特征图的深度

1x1的卷积核由于大小只有1x1,所以并不需要考虑像素跟周边像素的关系,它主要用于调节通道数,对不同的通道上的像素点进行线性组合,然后进行非线性化操作,可以完成升维和降维的功能,如下图所示,选择2个1x1大小的卷积核,那么特征图的深度将会从3变成2,如果使用4个1x1的卷积核,特征图的深度将会由3变成4。
在这里插入图片描述
使用1x1卷积核,实现降维和升维的操作其实就是 channel 间信息的线性组合变化,3x3,64channels的卷积核后面添加一个1x1,28channels的卷积核,就变成了3x3,28channels的卷积核,原来的64个channels就可以理解为跨通道线性组合变成了28channels,这就是通道间的信息交互。
注意:只是在channel维度上做线性组合,W和H上是共享权值的sliding window
维度并没有减少或者增加,改变的只是 height × width × channels 中的 channels 这一个维度的大小而已,而且保持特征图的高和宽不变

(2)减少参数

前面所说的降维,其实也是减少了参数,因为特征图少了,参数也自然跟着就减少,相当于在特征图的通道数上进行卷积,压缩特征图,二次提取特征,使得新特征图的特征表达更佳
在GoogleNet的3a模块中,假设输入特征图的大小是2828192,1x1卷积通道为64,3x3卷积通道为128,5x5卷积通道为32,如下图所示:
在这里插入图片描述
左边的卷积核参数计算如下:
192 × (1×1×64) +192 × (3×3×128) + 192 × (5×5×32) = 387072
而右图的3x3卷积层前加入通道数为96的1x1的卷积,5x5的特征图后面加入通道数为16的1x1的卷积,参数的计算如下:
192 × (1×1×64) +(192×1×1×96+ 96 × 3×3×128)+(192×1×1×16+16×5×5×32)= 157184

(3)加非线性
1*1卷积核,可以在保持feature map尺度不变的(即不损失分辨率)的前提下大幅增加非线性特性(利用后接的非线性激活函数),把网络做的很deep。

备注:一个filter对应卷积后得到一个feature map,不同的filter(不同的weight和bias),卷积以后得到不同的feature map,提取不同的特征,得到对应的specialized neuron[7]。

二、CNN 经典模型

1、LeNet5

LeNet-5:是Yann LeCun在1998年设计的用于手写数字识别的卷积神经网络,当年美国大多数银行就是用它来识别支票上面的手写数字的,它是早期卷积神经网络中最有代表性的实验系统之一。

LenNet-5 共有 7 层(不包括输入层),每层都包含不同数量的训练参数,如下图所示。
在这里插入图片描述
LeNet-5 中主要有 2 个卷积层、2 个下抽样层(池化层)、3 个全连接层3种连接方式。

(1)LeNet5 特征

1)卷积神经网络使用三个层作为一个系列: 卷积,池化,非线性
2) 使用卷积提取空间特征
3)使用映射到空间均值下采样(subsample)
4)双曲线(tanh)或 S 型(sigmoid)形式的非线性
5)多层神经网络(MLP)作为最后的分类器
6)层与层之间的稀疏连接矩阵避免大的计算成本

(2)LeNet-5 的训练算法

训练算法与传统的BP算法差不多。主要包括4步,这4步被分为两个阶段:
第一阶段,向前传播阶段:

a)从样本集中取一个样本(X,Yp),将X输入网络;
b)计算相应的实际输出Op。
在此阶段,信息从输入层经过逐级的变换,传送到输出层。这个过程也是网络在完成训练后正常运行时执行的过程。在此过程中,网络执行的是计算(实际上就是输入与每层的权值矩阵相点乘,得到最后的输出结果):
Op=Fn(…(F2(F1(XpW(1))W(2))…)W(n))

第二阶段,反向传播阶段
a)算实际输出Op与相应的理想输出Yp的差;
b)按极小化误差的方法反向传播调整权矩阵。

(3)LaNet-5的局限性

CNN能够得出原始图像的有效表征,这使得CNN能够直接从原始像素中,经过极少的预处理,识别视觉上面的规律。然而,由于当时缺乏大规模训练数据,计算机的计算能力也跟不上,LeNet-5 对于复杂问题的处理结果并不理想。

2、AlexNet

AlexNet是由 Hinton 的学生 Alex Krizhevsky 在 2012 年提出的深度卷积网络,可以看做是 Lenet 加深加宽版本。AlexNet 中采用了一系列的新的技术点:成功应用了 Relu、Dropout 和 LRN 等 trick,首次采用 GPU 进行加速。

整个AlexNet有8个需要训练参数的层(不包括池化层和LRN层),前5层为卷积层,后3层为全连接层,如图4所示。AlexNet最后一层是有1000类输出的Softmax层用作分类。 LRN层出现在第1个及第2个卷积层后,而最大池化层出现在两个LRN层及最后一个卷积层后。ReLU激活函数则应用在这8层每一层的后面。
在这里插入图片描述
整个网络呈一个金字塔结构,具体来说:
(1)输入图片是224 * 224像素的三通道图片;
(2)第一层使用11 * 11的卷积核,滑动步长为4个像素,输出为96个特征图并进行最大值池化;
(3)第二层使用5 * 5卷积核,卷积产生256个特征图,并进行最大池化;
(4)第三层,第四层均使用3 * 3卷积核,输出384个特征图;
(5)第五层使用3 * 3卷积层,输出256个特征图,并进行池化;
(6)第六层,第七层为全连接层,分别包含 4096 个隐层,也就是说,到全连接层时只剩4096个特征值;
(7)最终,第八层为 softmax 层,得到最终的分类结果。
在这里插入图片描述

在这里插入图片描述

(1)AlexNet 主要使用到的新技术点如下:

(1)成功使用 ReLU 作为CNN的激活函数,并验证其效果在较深的网络超过了Sigmoid,成功解决了Sigmoid在网络较深时的梯度弥散问题。虽然 ReLU 激活函数在很久之前就被提出了,但是直到 AlexNet 的出现才将其发扬光大。
(2)训练时使用 Dropout 随机忽略一部分神经元,以避免模型过拟合。Dropout 虽有单独的论文论述,但是 AlexNet 将其实用化,通过实践证实了它的效果。在 AlexNet 中主要是最后几个全连接层使用了 Dropout。
在这里插入图片描述
(3)在 CNN 中使用重叠的最大池化。此前 CNN 中普遍使用平均池化,AlexNet 全部使用最大池化,避免平均池化的模糊化效果。并且 AlexNet 中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
(4)提出了 LRN 层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
(5)使用 CUDA 加速深度卷积网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵运算。AlexNet使用了两块GTX 580 GPU进行训练,单个GTX 580只有3GB显存,这限制了可训练的网络的最大规模。因此作者将AlexNet分布在两个GPU上,在每个GPU的显存中储存一半的神经元的参数。因为GPU之间通信方便,可以互相访问显存,而不需要通过主机内存,所以同时使用多块GPU也是非常高效的。同时,AlexNet的设计让GPU之间的通信只在网络的某些层进行,控制了通信的性能损耗。 
(6)使用数据增强技术包括图像转换,水平反射和补丁提取。,随机地从256´256的原始图像中截取224´224大小的区域(以及水平翻转的镜像),相当于增加了(256-224)2´2=2048倍的数据量。如果没有数据增强,仅靠原始的数据量,参数众多的CNN会陷入过拟合中,使用了数据增强后可以大大减轻过拟合,提升泛化能力。进行预测时,则是取图片的四个角加中间共5个位置,并进行左右翻转,一共获得10张图片,对他们进行预测并对10次结果求均值。同时,AlexNet论文中提到了会对图像的RGB数据进行PCA处理,并对主成分做一个标准差为0.1的高斯扰动,增加一些噪声,这个Trick可以让错误率再下降1%。
(7) 使用 mini-batch SGD 训练模型,具有动量和重量衰减的特定值。
(8)每一层权重均初始化为0均值0.01标准差的高斯分布,在第二层、第四层和第五层卷积的偏置被设置为1.0,而其他层的则为0,目的是为了加速早期学习的速率(因为激活函数是ReLU,1.0的偏置可以让大部分输出为正)。
(9)学习速率初始值为0.01,在训练结束前共减小3次,每次减小都出现在错误率停止减少的时候,每次减小都是把学习速率除以10 。
(10)局部响应归一化。在使用饱和型的激活函数时,通常需要对输入进行归一化处理,以利用激活函数在0附近的线性特性与非线性特性,并避免饱和,但对于ReLU函数,不需要输入归一化。然而,Alex等人发现通过LRN这种归一化方式可以帮助提高网络的泛化性能。LRN的作用就是,对位置(x, y)处的像素计算其与几个相邻的kernel maps的像素值的和,并除以这个和来归一化。

3、VGGNet(Visual Geometry Group)

VGGNet 是牛津大学计算机视觉研究组(Visual Geometry Group)和Google DeepMind公司的研究员们一起研发的深度卷积神经网络。主要特点是 “简洁,深度”。 深, 是因为VGG有19层,远远超过了它的前辈; 而简洁,则是在于它的结构上,一律采用 stride 为1的 3×3 的 filter,以及 stride 为 2 的 2×2 的MaxPooling。
在这里插入图片描述

VGGNet探索了卷积神经网络的深度与其性能之间的关系,通过反复的堆叠3×3的小型卷积核和2×2的最大池化层,构建了16~19层深度的卷积神经网络。整个网络结构简洁,都使用同样大小的卷积核尺寸(3×3)和最大池化尺寸(2×2)。VGGNet的扩展性很强,迁移到其他图片数据上的泛化性很好,因此,截止到目前为止,也常被用来抽取图像的特征。
VggNet 一共有六种不同的网络结构,但是每种结构都有5组卷积,每组内有 2~3 个卷积层,卷积都使用3x3的卷积核,同时每组尾部会连接一个2x2的最大池化层用来缩小图片尺寸。每组内的卷积核数量一样,越靠后的段的卷积核数量越多:64 – 128 – 256 – 512 – 512。卷积后面是三个全连接层。在训练高级别的网络时,可以先训练低级别的网络,用前者获得的权重初始化高级别的网络,可以加速网络的收敛。

(1)要点

在这里插入图片描述
● 仅使用 3x3 尺寸的 filter 与 AlexNet 的第一层 11x11 filter 和 ZF Net 的 7x7 filter 完全不同。

作者的推理是两个3x3 conv 层的组合具有 5x5 的有效感受野,三个3x3 conv 层的组合具有 7x7 的有效感受野,这又可以模拟更大的 filter,同时保持较小 filter 尺寸的优势,其中一个好处是减少了参数的数量。此外,使用两个转换层,我们可以使用两个 ReLU 层而不是一个。
在这里插入图片描述
● 随着每层输入卷的空间大小减小(转换层和池层的结果),当您沿着网络向下时,由于 filter 数量的增加,卷的深度会增加。
● 有趣的是注意到每个 maxpool 层之后过滤器的数量翻倍,这加强了缩小空间尺寸的想法,但增加了深度
● 在图像分类和本地化任务方面都做得很好。作者使用一种本地化形式作为回归。
● 使用Caffe工具箱构建模型。
● 在训练期间使用 scale jittering 比例抖动作为一种数据增强技术。
● 在每个转换层之后使用 ReLU 层并使用批量梯度下降进行训练。
● 在4个Nvidia Titan Black GPU上训练了两到三周。
LRN 层作用不大(VGGNet不使用局部响应标准化(LRN),这种标准化并不能在 ILSVRC 数据集上提升性能,却导致更多的内存消耗和计算时间

(1)VGGNet 训练技巧

先训练级别A的简单网络,再复用A网络的权重来初始化后面的几个复杂模型,这样训练收敛的速度更快。在预测时,VGG采用Multi-Scale的方法,将图像scale到一个尺寸Q,并将图片输入卷积网络计算。然后在最后一个卷积层使用滑窗的方式进行分类预测,将不同窗口的分类结果平均,再将不同尺寸Q的结果平均得到最后结果,这样可提高图片数据的利用率并提升预测准确率。在训练中,VGGNet 还使用 Multi-Scale的方法做数据增强,将原始图像缩放到不同尺寸S,然后再随机裁切224´224的图片,这样能增加很多数据量,对于防止模型过拟合有很不错的效果

(2)在训练的过程中,比AlexNet收敛的要快一些,原因为:

使用小卷积核和更深的网络进行的正则化;
在特定的层使用了预训练得到的数据进行参数的初始化。

4、GoogleNet

inception(也称GoogLeNet)是 2014 年 Christian Szegedy 提出的一种全新的深度学习结构,在这之前的 AlexNet、VGG 等结构都是通过增大网络的深度(层数)来获得更好的训练效果,但层数的增加会带来很多负作用,比如 overfit、梯度消失、梯度爆炸等。inception 的提出则从另一种角度来提升训练结果:能更高效的利用计算资源,在相同的计算量下能提取到更多的特征,从而提升训练结果。

inception 跳出直线加深网络层数的思路,通过增加“宽度”的方式增加网络复杂度,避免陷入卷积核选择的陷阱,让程序自己学习如何选择卷积核。具体来说中,是在每一个卷积层,并行使用1 * 1卷积核,3 * 3 卷积核,5 * 5卷积核和池化,同时提取不同尺度的特征,然后通过1*1的卷积核对每一个分支进行降维后,最后将结果合并拼接在一起。直观地看起来,好像结构复杂了很多,本来只要一两个卷积就可以完成地计算,现在却要使用四五种不同地操作。但是仔细分析可以发现,这样地设计不仅减少了参数地数量,而且由于增加了网络地“宽度”,网络对多种尺度地适应性就更好了。
inception 结构:在这里插入图片描述
GoogleNet 结构:
在这里插入图片描述
结构参数:
在这里插入图片描述
在这里插入图片描述
#3X3 reduce 、 #5X5 reduce 以及 pool proj 是降维处理
其中 inception 的输出通道数 = (#1X1)+ (#3X3)+(#5X5)+ pool proj

要点

在这里插入图片描述
1、在整个架构中使用了 9 个 Inception 模块,总共超过 100 层!
2、没有使用全连接层!使用全局平均 pooling,从 7x7x1024 volume 到 1x1x1024 volume。这节省了大量参数
3、训练过程使用辅助分类器结构进行训练;但是验证和测试过程不需要辅助分类器,需要将其关闭。
在这里插入图片描述
3、使用的参数比 AlexNet 少12倍。
4、在测试过程中,创建了相同图像的多个作物,并将其输入网络,并对 softmax 概率进行平均,以便为我们提供最终解决方案。
5、利用 R-CNN 的概念来检测它们的检测模型。
6、Inception 模块有更新版本(版本6和7)。
7、接受“一周内几个高端GPU”的训练。

(1)1x1 卷积的作用

可以看到图中有多个黄色的1x1卷积模块,这样的卷积有什么用处呢?

作用1:在相同尺寸的感受野中叠加更多的卷积,能提取到更丰富的特征。这个观点来自于Network in Network(NIN, https://arxiv.org/pdf/1312.4400.pdf),图1里三个1x1卷积都起到了该作用。

在这里插入图片描述
左侧是是传统的卷积层结构(线性卷积),在一个尺度上只有一次卷积;右图是Network in Network结构(NIN结构),先进行一次普通的卷积(比如3x3),紧跟再进行一次1x1的卷积,对于某个像素点来说1x1卷积等效于该像素点在所有特征上进行一次全连接的计算,所以右侧图的1x1卷积画成了全连接层的形式,需要注意的是NIN结构中无论是第一个3x3卷积还是新增的1x1卷积,后面都紧跟着激活函数(比如relu)。将两个卷积串联,就能组合出更多的非线性特征。

作用2:使用 1x1 卷积进行降维,降低了计算复杂度

图 2 中间 3x3 卷积和 5x5 卷积前的1x1卷积都起到了这个作用。当某个卷积层输入的特征数较多,对这个输入进行卷积运算将产生巨大的计算量;如果对输入先进行降维,减少特征数后再做卷积计算量就会显著减少。
在这里插入图片描述
在这里插入图片描述

(2)多个尺寸上进行卷积再聚合

图中可以看到对输入做了4个分支,分别用不同尺寸的filter进行卷积或池化,最后再在特征维度上拼接到一起。这种全新的结构有什么好处呢?Szegedy从多个角度进行了解释:

解释1:在直观感觉上在多个尺度上同时进行卷积,能提取到不同尺度的特征。特征更为丰富也意味着最后分类判断时更加准确。
解释2:利用稀疏矩阵分解成密集矩阵计算的原理来加快收敛速度

5、ResNets

对于深度神经网络来说,VGGNets 证明了加深网络层次是提高精度的有效手段,但是由于梯度弥散的问题导致网络深度无法持续加深。梯度弥散问题是由于在反向传播过程中误差不断累积,导致在最初的几层梯度值几乎为 0,从而无法收敛。经过测试,20层以上的深层网络,会随着层数的增加,收敛效果越来越差,50层的网络是20层的网络所得错误率的一倍。这一现象称为深度网络的退化问题。

ResNet 就是为了解决这个问题而提出的,因而帮助我们训练更深的网络。 它引入了一个 residual block(残差块)。

ResNet声名鹊起的一个很重要的原因是,它提出了残差学习的思想。图6.8为ResNet的一个残差学习模块,该模块包含多个卷积层,多个卷积层对这个残差学习模块的输入数据 进行 的变化,同时原始输入信息跳过多个卷积层直接传导到后面的层中,最终将 的整体作为输入,并用激活函数激活,从而得到这个残差学习模块的输出结果。所以本质上 是输出结果和输入结果之间的差值,即残差。ResNet学习的就是 ,因此ResNet又叫作残差网络。
在这里插入图片描述
残差学习模块的优势

传统的卷积神经网络或者全连接网络,在信息传递时,或多或少会存在信息丢失、损耗等问题,同时还会导致梯度消失或梯度爆炸,使得很深的网络无法训练。ResNet通过提出残差学习的思想,在一定程度上解决了这个问题。通过将输入信息X“绕道”传导到输出,极大保护了信息的完整性,整个网络只需要学习输入、输出和残差部分,即 就能简化学习的目标和难度。

在2012年的ILSVRC挑战赛中,AlexNet取得了冠军,并且大幅度领先于第二名。由此引发了对AlexNet广泛研究,并让大家树立了一个信念——“越深网络准确率越高”。这个信念随着VGGNet、Inception v1、Inception v2、Inception v3不断验证、不断强化,得到越来越多的认可,但是,始终有一个问题无法回避,这个信念正确吗?
它是正确的,至少在理论上是正确的。
假设一个层数较少的神经网络已经达到了较高准确率,我们可以在这个神经网络之后,拼接一段恒等变换的网络层,这些恒等变换的网络层对输入数据不做任何转换,直接返回(y=x),就能得到一个深度较大的神经网络,并且,这个深度较大的神经网络的准确率等于拼接之前的神经网络准确率,准确率没有理由降低。
在这里插入图片描述
通过实验,ResNet随着网络层不断的加深,模型的准确率先是不断的提高,达到最大值(准确率饱和),然后随着网络深度的继续增加,模型准确率毫无征兆的出现大幅度的降低。
这个现象与“越深的网络准确率越高”的信念显然是矛盾的、冲突的。ResNet团队把这一现象称为“退化(Degradation)”。
ResNet团队把退化现象归因为深层神经网络难以实现“恒等变换(y=x)”。乍一看,让人难以置信,原来能够模拟任何函数的深层神经网络,竟然无法实现恒等变换这么简单的映射了?
让我们来回想深度学习的起源,与传统的机器学习相比,深度学习的关键特征在于网络层数更深、非线性转换(激活)、自动的特征提取和特征转换,其中,非线性转换是关键目标,它将数据映射到高纬空间以便于更好的完成“数据分类”。随着网络深度的不断增大,所引入的激活函数也越来越多,数据被映射到更加离散的空间,此时已经难以让数据回到原点(恒等变换)。或者说,神经网络将这些数据映射回原点所需要的计算量,已经远远超过我们所能承受的。
退化现象让我们对非线性转换进行反思,非线性转换极大的提高了数据分类能力,但是,随着网络的深度不断的加大,我们在非线性转换方面已经走的太远,竟然无法实现线性转换。显然,在神经网络中增加线性转换分支成为很好的选择,于是,ResNet团队在ResNet模块中增加了快捷连接分支,在线性转换和非线性转换之间寻求一个平衡

(1)深层次卷积神经网络的存在问题
在这里插入图片描述

(2)ResNet网络架构

层数较多的神经网络,可由较浅的神经网络和恒等变换网络拼接而成,如图所示。

在这里插入图片描述

与普通的CNN相比,ResNet 最大的不同在于 ResNet 有很多的旁路直线将输入直接连到网络后面的层中,使得网络后面的层也可以直接学习残差,这种网络结构成为 shortcut 或 skip connection。这样做解决了传统CNN在信息传递时,或多或少会丢失原始信息的问题,保护数据的完整性,整个网络只需要学习输入、输出差别的一部分,简化了学习的难度和目标。
ResNet 提出了两种 mapping:一种是 identity mapping,指的就是下图中”弯弯的曲线”,另一种residual mapping,指的就是除了”弯弯的曲线“那部分,所以最后的输出是 y=F(x)+x。identity mapping顾名思义,就是指本身,也就是公式中的x,而residual mapping指的是“差”,也就是y−x,所以残差指的就是F(x)部分。
左边的残差结构是针对层数较少网络,例如 ResNet18 层和 ResNet34 层网络。右边是针对网络层数较多的网络,例如 ResNet101,ResNet152 等。为什么深层网络要使用右侧的残差结构呢。因为,右侧的残差结构能够减少网络参数与运算量。同样输入一个channel为256的特征矩阵,如果使用左侧的残差结构需要大约1170648个参数,但如果使用右侧的残差结构只需要69632个参数。明显搭建深层网络时,使用右侧的残差结构更合适。

浅层次残差结构(针对ResNet18/34)

这里是引用
如上图所示,该残差结构的主分支是由两层 3x3 的卷积层组成,而残差结构右侧的连接线是 shortcut 分支也称捷径分支(注意为了让主分支上的输出矩阵能够与我们捷径分支上的输出矩阵进行相加,必须保证这两个输出特征矩阵有相同的shape)。
如果刚刚仔细观察了ResNet34网络结构图的同学,应该能够发现图中会有一些虚线的残差结构。在原论文中作者只是简单说了这些虚线残差结构有调整特征图大小的作用,从而使得上一层残差结构的输出符合该层残差结构的输入并在捷径分支上通过1x1的卷积核进行降维处理。而在实线的残差结构中,输入和输出矩阵的高宽都是相同的。上图右侧给出了详细的虚线残差结构,注意下每个卷积层的步距 stride,以及捷径分支上的卷积核的个数(与主分支上的卷积核个数相同)。

深层次残差结构(针对ResNet50/101/152)

在这里插入图片描述
如上图所示。在该残差结构当中,主分支使用了三个卷积层,第一个是1x1的卷积层用来压缩 channel 维度,第二个是 3x3 的卷积层,第三个是 1x1 的卷积层用来还原 channel 维度(注意主分支上第一层卷积层和第二次卷积层所使用的卷积核个数是相同的,第三次是第一层的 4 倍)。该残差结构所对应的虚线残差结构如上图右侧所示,同样在捷径分支上有一层1x1的卷积层,它的卷积核个数与主分支上的第三层卷积层卷积核个数相同,注意每个卷积层的步距。

(3)两种 Shortcut Connection 方式

在这里插入图片描述
如上图所示,如果 F(x) 和 x 的 channel 个数不同怎么办,因为 F(x) 和 x 是按照 channel
维度相加的,channel 不同怎么相加呢? 针对channel个数是否相同,要分成两种情况考虑,如下图:
在这里插入图片描述
如上图所示,我们可以清楚的”实线“和”虚线“两种连接方式:
● 实线的的 Connection 部分(”第一个粉色矩形和第三个粉色矩形“)都是执行 3x3x64 的卷积,他们的 channel 个数一致,所以采用计算方式: y=F(x)+x。
在这里插入图片描述
● 虚线的的Connection部分(”第一个绿色矩形和第三个绿色矩形“)分别是3x3x64和3x3x128的卷积操作,他们的channel个数不同(64和128),所以采用计算方式:y=F(x)+W·x 。其中W是卷积操作,用来调整x的channel维度的
在这里插入图片描述
虚线残差结构有调整特征图大小的作用,从而使得上一层残差结构的输出符合该层残差结构的输入并在捷径分支上通过1x1的卷积核进行降维处理。而在实线的残差结构中,输入和输出矩阵的高宽都是相同的。上图右侧给出了详细的虚线残差结构,注意下每个卷积层的步距 stride,以及捷径分支上的卷积核的个数(与主分支上的卷积核个数相同)。

从实际实验的结果来看,残差网络的效果是非常明显的。如论文里所说,类似VGGNet的结构在超过20个参数层以后,收敛效果会大打折扣,准确率比较差,但是简单地加入一些“捷径”(shortcut)连接边后,使其转变为残差结构,收敛效果都急剧提高,精度也随着训练次数地增加持续提高,并且不断加深网络深度还可以持续提高准确率,残差网络与VGG结构地对比如图所示:
在这里插入图片描述

(3)不同深度的ResNet网络结构配置
在这里插入图片描述

(4)ResNet 网络结构详解

以 34 层 ResNet 模型架构图为例:
在这里插入图片描述
在这里插入图片描述

(1)conv1层,该层使用64个7×7的卷积核,步长为2,将224×224大小的彩色图像降维到112×112。
(2)conv2_x层,首先进行3×3的最大值池化,步长为2,将维度进一步降低为56×56,然后是3个残差学习模块,每一个模块都由两个卷积层组成,卷积核大小为3×3,64个通道。
(3)conv3_x层,由4个残差学习模块组成,由于conv2_3的输出结果是56×56,因此在conv3_1的某一卷积层,需要将步长调整为2,从而将conv3_4的输出维度降低到28×28。
(4)conv4_x层,由6个残差学习模块组成,同理,在conv4_1中的某一卷积层需要将步长调整为2,从而将conv4_6的输出维度降低到14×14。
(5)conv5_x层,由3个残差学习模块组成,同理,在conv5_1将步长调整为2,最后输出7×7维的图像。
(6)最后是一个全连接层,输出到1 000分类。

6、MobileNet

(1)深度可分离卷积与逐点卷积

MobileNet 的基本单元是深度级可分离卷积(depthwise separable convolution——DSC),其实这种结构之前已经被使用在Inception模型中。
可分离卷积主要有两种类型:空间可分离卷积和深度可分离卷积。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
为什么要深度可分离卷积?
在这里插入图片描述
在这里插入图片描述
(2)MobileNet V1

MobileNet V1是一种基于流水线结构,使用深度可分离卷积构建的轻量级神经网络,并通过两个超参数的引入使得开发人员可以基于自己的应用和资源限制选择合适的模型。
从概念上来说,MobileNetV1正试图实现两个基本目标,以构建移动第一计算视觉模型:1,较小的模型,参数数量更少;2,较小的复杂度,运算中乘法和加法更少。遵循这些原则,MobileNet V1 是一个小型,低延迟,低功耗的参数化模型,可以满足各种用例的资源约束。它们可以用于实现:分类,检测,嵌入和分割等功能。

MobileNet V1的创新点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

MobileNet V1 的网络架构

MobileNet V1 的核心架构则基于一个流线型架构,该架构使用深度可分离卷积网络来构建了轻量化深度神经网络。就神经网络结构而言,深度可分类卷积将卷积核分为两个单独的卷积核,这两个卷积核依次进行两个卷积,即先是深度卷积,然后进行逐点卷积,如下图所示:
在这里插入图片描述
在MobileNetV1中,深度卷积网络的每个输入信道都应用了单个滤波器。然后,逐点卷积应用 1*1 卷积网络来合并深度卷积的输出。这种标准卷积方法既能滤波,又能一步将输入合并成一组新的输出。在这之中,深度可分离卷积将其分为两次,一层用于滤波,另一层则用于合并。

MobileNet的网络结构如下,一共由 28层构成(不包括AvgPool 和 FC 层,且把深度卷积和逐点卷积分开算),其除了第一层采用的是标准卷积核之外,剩下的卷积层都是用Depth Wise Separable Convolution。

模型参数 在这里插入图片描述

(3)MobileNet V2

MobileNet V2基于MobileNet V1的一些思想,并结合新的思想来优化。从架构上来看,MobileNet V2为架构增添了两个新模块:1,引入了层与层之间的线性瓶颈;2,瓶颈之间的快捷连接。
MobileNetV2之中的核心思想是,瓶颈对模型的中间输入和输出进行编码,而内层则用于封装模型从较低级别概念(如:像素等)转换到较高级别描述符(如:图像类别等)的能力。最后,与传统的剩余连接一样,快捷方式能够实现更快地训练速度和更高的准确率。
在这里插入图片描述
在这里插入图片描述
MobileNet V2 的创新点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

MobileNet V2 网络架构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4)MobileNet V3

MobileNet V3 的创新点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

MobileNet V3 网络结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(1)起始部分
在这里插入图片描述
(2)中间部分
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
中间每个层的结构
在这里插入图片描述
(3)结尾部分
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/IT__learning/article/details/118701692

智能推荐

C#连接OPC C#上位机链接PLC程序源码 1.该程序是通讯方式是CSharp通过OPC方式连接PLC_c#opc通信-程序员宅基地

文章浏览阅读565次。本文主要介绍如何使用C#通过OPC方式连接PLC,并提供了相应的程序和学习资料,以便读者学习和使用。OPC服务器是一种软件,可以将PLC的数据转换为标准的OPC格式,允许其他软件通过标准接口读取或控制PLC的数据。此外,本文还提供了一些学习资料,包括OPC和PLC的基础知识,C#编程语言的教程和实例代码。这些资料可以帮助读者更好地理解和应用本文介绍的程序。1.该程序是通讯方式是CSharp通过OPC方式连接PLC,用这种方式连PLC不用考虑什么种类PLC,只要OPC服务器里有的PLC都可以连。_c#opc通信

Hyper-V内的虚拟机复制粘贴_win10 hyper-v ubuntu18.04 文件拷贝-程序员宅基地

文章浏览阅读1.6w次,点赞3次,收藏10次。实践环境物理机:Windows10教育版,操作系统版本 17763.914虚拟机:Ubuntu18.04.3桌面版在Hyper-V中的刚安装好Ubuntu虚拟机之后,会发现鼠标滑动很不顺畅,也不能向虚拟机中拖拽文件或者复制内容。在VMware中,可以通过安装VMware tools来使物理机和虚拟机之间达到更好的交互。在Hyper-V中,也有这样的工具。这款工具可以完成更好的鼠标交互,我的..._win10 hyper-v ubuntu18.04 文件拷贝

java静态变量初始化多线程,持续更新中_类初始化一个静态属性 为线程池-程序员宅基地

文章浏览阅读156次。前言互联网时代,瞬息万变。一个小小的走错,就有可能落后于别人。我们没办法去预测任何行业、任何职业未来十年会怎么样,因为未来谁都不能确定。只能说只要有互联网存在,程序员依然是个高薪热门行业。只要跟随着时代的脚步,学习新的知识。程序员是不可能会消失的,或者说不可能会没钱赚的。我们经常可以听到很多人说,程序员是一个吃青春饭的行当。因为大多数人认为这是一个需要高强度脑力劳动的工种,而30岁、40岁,甚至50岁的程序员身体机能逐渐弱化,家庭琐事缠身,已经不能再进行这样高强度的工作了。那么,这样的说法是对的么?_类初始化一个静态属性 为线程池

idea 配置maven,其实不用单独下载Maven的。以及设置新项目配置,省略每次创建新项目都要配置一次Maven_安装idea后是不是不需要安装maven了?-程序员宅基地

文章浏览阅读1w次,点赞13次,收藏43次。说来也是惭愧,一直以来,在装环境的时候都会从官网下载Maven。然后再在idea里配置Maven。以为从官网下载的Maven是必须的步骤,直到今天才得知,idea有捆绑的 Maven 我们只需要搞一个配置文件就行了无需再官网下载Maven包以后再在新电脑装环境的时候,只需要下载idea ,网上找一个Maven的配置文件 放到 默认的 包下面就可以了!也省得每次创建项目都要重新配一次Maven了。如果不想每次新建项目都要重新配置Maven,一种方法就是使用默认的配置,另一种方法就是配置 .._安装idea后是不是不需要安装maven了?

奶爸奶妈必看给宝宝摄影大全-程序员宅基地

文章浏览阅读45次。家是我们一生中最重要的地方,小时候,我们在这里哭、在这里笑、在这里学习走路,在这里有我们最真实的时光,用相机把它记下吧。  很多家庭在拍摄孩子时有一个看法,认为儿童摄影团购必须是在风景秀丽的户外,即便是室内那也是像大酒店一样...

构建Docker镜像指南,含实战案例_rocker/r-base镜像-程序员宅基地

文章浏览阅读429次。Dockerfile介绍Dockerfile是构建镜像的指令文件,由一组指令组成,文件中每条指令对应linux中一条命令,在执行构建Docker镜像时,将读取Dockerfile中的指令,根据指令来操作生成指定Docker镜像。Dockerfile结构:主要由基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令。每行支持一条指令,每条指令可以携带多个参数。注释可以使用#开头。指令说明FROM 镜像 : 指定新的镜像所基于的镜像MAINTAINER 名字 : 说明新镜像的维护(制作)人,留下_rocker/r-base镜像

随便推点

毕设基于微信小程序的小区管理系统的设计ssm毕业设计_ssm基于微信小程序的公寓生活管理系统-程序员宅基地

文章浏览阅读223次。该系统将提供便捷的信息发布、物业报修、社区互动等功能,为小区居民提供更加便利、高效的服务。引言: 随着城市化进程的加速,小区管理成为一个日益重要的任务。因此,设计一个基于微信小程序的小区管理系统成为了一项具有挑战性和重要性的毕设课题。本文将介绍该小区管理系统的设计思路和功能,以期为小区提供更便捷、高效的管理手段。四、总结与展望: 通过本次毕设项目,我们实现了一个基于微信小程序的小区管理系统,为小区居民提供了更加便捷、高效的服务。通过该系统的设计与实现,能够提高小区管理水平,提供更好的居住环境和服务。_ssm基于微信小程序的公寓生活管理系统

如何正确的使用Ubuntu以及安装常用的渗透工具集.-程序员宅基地

文章浏览阅读635次。文章来源i春秋入坑Ubuntu半年多了记得一开始学的时候基本一星期重装三四次=-= 尴尬了 觉得自己差不多可以的时候 就吧Windows10干掉了 c盘装Ubuntu 专心学习. 这里主要来说一下使用Ubuntu的正确姿势Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu 是基于DebianGNU/Linux,支..._ubuntu安装攻击工具包

JNI参数传递引用_jni引用byte[]-程序员宅基地

文章浏览阅读335次。需求:C++中将BYTE型数组传递给Java中,考虑到内存释放问题,未采用通过返回值进行数据传递。public class demoClass{public native boolean getData(byte[] tempData);}JNIEXPORT jboolean JNICALL Java_com_core_getData(JNIEnv *env, jobject thisObj, jbyteArray tempData){ //resultsize为s..._jni引用byte[]

三维重建工具——pclpy教程之点云分割_pclpy.pcl.pointcloud.pointxyzi转为numpy-程序员宅基地

文章浏览阅读2.1k次,点赞5次,收藏30次。本教程代码开源:GitHub 欢迎star文章目录一、平面模型分割1. 代码2. 说明3. 运行二、圆柱模型分割1. 代码2. 说明3. 运行三、欧几里得聚类提取1. 代码2. 说明3. 运行四、区域生长分割1. 代码2. 说明3. 运行五、基于最小切割的分割1. 代码2. 说明3. 运行六、使用 ProgressiveMorphologicalFilter 分割地面1. 代码2. 说明3. 运行一、平面模型分割在本教程中,我们将学习如何对一组点进行简单的平面分割,即找到支持平面模型的点云中的所有._pclpy.pcl.pointcloud.pointxyzi转为numpy

以NFS启动方式构建arm-linux仿真运行环境-程序员宅基地

文章浏览阅读141次。一 其实在 skyeye 上移植 arm-linux 并非难事,网上也有不少资料, 只是大都遗漏细节, 以致细微之处卡壳,所以本文力求详实清析, 希望能对大家有点用处。本文旨在将 arm-linux 在 skyeye 上搭建起来,并在 arm-linux 上能成功 mount NFS 为目标, 最终我们能在 arm-linux 里运行我们自己的应用程序. 二 安装 Sky..._nfs启动 arm

攻防世界 Pwn 进阶 第二页_pwn snprintf-程序员宅基地

文章浏览阅读598次,点赞2次,收藏5次。00为了形成一个体系,想将前面学过的一些东西都拉来放在一起总结总结,方便学习,方便记忆。攻防世界 Pwn 新手攻防世界 Pwn 进阶 第一页01 4-ReeHY-main-100超详细的wp1超详细的wp203 format2栈迁移的两种作用之一:栈溢出太小,进行栈迁移从而能够写入更多shellcode,进行更多操作。栈迁移一篇搞定有个陌生的函数。C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 _pwn snprintf

推荐文章

热门文章

相关标签