文章目录
- 介绍
- LetNet
- 填充&步长&通道数
- 填充
- 步长
- 通道数
- 卷积层
- 池化层
- 全连接层
- 激活函数
- 常见的激活函数
- Sigmoid函数
- tanh函数
- ReLU激活函数
- LReLU
- PReLU
- Swish
- softmax分类
- AlexNet
- VGGNet
- GoogleNet
- ResNet
- DenseNet
- SENet
介绍
现有的卷积神经网络的结构可以按照下图机型分类,如基于空间、深度、多宽度、特征通道、注意力等结构,常见的卷积神经网络主要有LeNet、AlexNet、VGGNet、GoogleNet、ResNet、DenseNet、SENet等。
LetNet
LeNet是Yann LeCun在1998年提出的网络结构,是最早出现的第一代卷积神经网络。如今在各大深度学习框架中常用的LeNet结构是经过改进后的LeNet5,它与最初的LeNet有细微的差别,如把激活函数tanh换成了ReLU等。
首先输入图像是单通道28×28的图像,用矩阵表示就是[1,28,28];
第一个卷积层conv1所用的卷积核尺寸为5×5,滑动步长为1,卷积核数目为20,那么经过该层后图像尺寸变为24(28-5+1),输出矩阵为[20,24,24];
第一个池化层pool核尺寸为2×2,步长为2,这是没有重叠的最大池化,池化操作后,图像尺寸减半,变为12×12,输出矩阵为[20,12,12];
第二个卷积层conv2的卷积核尺寸为5×5,滑动步长为1,卷积核数目为50,那么经过该层后图像尺寸变为8(12-5+1),输出矩阵为[50,8,8];
第二个池化层pool2核尺寸为2×2,步长为2,这是没有重叠的最大池化,池化操作后,图像尺寸减半,变为4×4,输出矩阵为[50,4,4;
pool2后接全连接层fc1,神经元数目为500,再接ReLU激活函数;
再接fc2,神经元个数为10,得到10维的特征向量,用于10个数字的分类训练,送入softmax分类,得到分类结果的概率输出。
填充&步长&通道数
填充
填充( Padding )是指在输入数据的边缘添加一定数量的像素,使得输出数据的尺寸能够与输入数据相匹配。也就是在矩阵的边界上填充一些值,以增加矩阵的大小,通常用 0 或者复制边界像素来进行填充。
步长
步长(Stride)是指卷积核在每一次卷积操作中滑动的距离。步长的大小可以影响输出数据的大小,也可以影响特征提取能力和计算复杂度。当步长增大时,输出数据的尺寸会减小,特征提取能力会变弱,但计算速度会加快。
通道数
通道数(Channel)也称为深度或特征图数量,是指卷积神经网络中每一层输出的特征图数量。通道数的大小直接影响了卷积神经网络的特征提取能力和计算复杂度。通过增加通道数,可以增强卷积神经网络的特征提取能力,但也会增加计算复杂度。
卷积层
卷积操作的实现可以使用滑动窗口的方式,即在输入图像上滑动一个卷积核,将卷积核和输入图像对应位置的像素值相乘并求和,得到输出图像中对应位置的像素值。对于多通道卷积,卷积核的通道数需要与输入数据的通道数相同,每个卷积核的每个通道都会与输入数据的相应通道进行卷积操作。在每次卷积操作中,卷积核会滑动到输入数据上的不同位置,与当前位置的数据进行卷积计算,得到一个输出值。假设处理后的图像为O,原始图像为X(图像尺寸为6×6),卷积核为F(卷积核尺寸为3×3)。此处为单通道的卷积计算示意。若出现了多个,则会得到多个处理结果。
O11=F11X11+F12X12+F13X13+F21X21+F22X22+F23X23+F31X31+F32X32+F33X33
O12=F11X12+F12X13+F13X14+F21X22+F22X23+F23X24+F31X32+F32X33+F33X34
O13=F11X13+F12X14+F13X15+F21X23+F22X24+F23X25+F31X33+F32X34+F33X35
O14=F11X14+F12X15+F13X16+F21X24+F22X25+F23X26+F31X34+F32X35+F33X36
O21=F11X21+F12X22+F13X23+F21X31+F22X32+F23X33+F31X41+F32X42+F33X43
O22=F11X22+F12X23+F13X24+F21X32+F22X33+F23X34+F31X42+F32X43+F33X44
O23=F11X23+F12X24+F13X25+F21X33+F22X34+F23X35+F31X43+F32X44+F33X45
O24=F11X24+F12X25+F13X26+F21X34+F22X35+F23X36+F31X44+F32X45+F33X46
O31=F11X31+F12X32+F13X33+F21X41+F22X42+F23X43+F31X51+F32X52+F33X53
O32=F11X32+F12X33+F13X34+F21X42+F22X43+F23X44+F31X52+F32X53+F33X54
O33=F11X33+F12X34+F13X35+F21X43+F22X44+F23X45+F31X53+F32X54+F33X55
O34=F11X34+F12X35+F13X36+F21X44+F22X45+F23X46+F31X54+F32X55+F33X56
O41=F11X41+F12X42+F13X43+F21X51+F22X52+F23X53+F31X61+F32X62+F33X63
O42=F11X42+F12X43+F13X44+F21X52+F22X53+F23X54+F31X62+F32X63+F33X64
O43=F11X43+F12X44+F13X45+F21X53+F22X54+F23X55+F31X63+F32X64+F33X65
O44=F11X44+F12X45+F13X46+F21X54+F22X55+F23X56+F31X64+F32X65+F33X66
池化层
池化层用于降低特征图的空间分辨率,并增强模型对输入图像的平移不变性和鲁棒性。池化操作后的结果相比其输入缩小了。池化层的引入是仿照人的视觉系统对视觉输入对象进行降维和抽象。在卷积神经网络过去的工作中,普遍认为池化层有如下三个功效:
1. 特征不变性:池化操作是模型更加关注是否存在某些特征而不是特征具体的位置。其中不变形性包括,平移不变性、旋转不变性和尺度不变性。平移不变性是指输出结果对输入对小量平移基本保持不变。对伸缩的不变形,如果原先的神经元在最大池化操作后输出5,那么经过伸缩(尺度变换)后,最大池化操作在该神经元上很大概率的输出仍是5.
2. 特征降维(下采样):池化相当于在空间范围内做了维度约减,从而使模型可以抽取更加广范围的特征。同时减小了下一层的输入大小,进而减少计算量和参数个数。
3. 在一定程度上防止过拟合,更方便优化。
4. 实现非线性(类似relu)。
5. 扩大感受野。
常见的池化层:
1. 平均池化(average pooling):计算图像区域的平均值作为该区域池化后的值。
2. 最大池化(max pooling):选图像区域的最大值作为该区域池化后的值。
3. 重叠池化(OverlappingPooling):重叠池化就是,相邻池化窗口之间有重叠区域,此时一般sizeX > stride。
4. 空金字塔池化(Spatial Pyramid Pooling):空间金字塔池化的思想源自 Spatial Pyramid Model,它将一个pooling变成了多个scale的pooling。用不同大小池化窗口作用于上层的卷积特征。也就是说 spatital pyramid pooling layer就是把前一卷积层的feature maps的每一个图片上进行了3个卷积操作,并把结果输出给全连接层。其中每一个pool操作可以看成是一个空间金字塔的一层。
下图示例为没有重叠的最大池化,步长为2,池化层尺寸为2×2
全连接层
全连接层在整个网络卷积神经网络中起到”分类器”的作用。如果说卷积层、池化层和激活函数等操作是将原始数据映射到隐层特征空间的话(特征提取+选择的过程),全连接层则起到将学到的特征表示映射到样本的标记空间的作用。换句话说,就是把特征整合到一起(高度提纯特征),方便交给最后的分类器或者回归。
全连接层存在的问题:参数冗余(仅全连接层参数就可占整个网络参数80%左右),降低了训练的速度,容易过拟合。
CNN(带有FC层)输入图片尺寸是固定的原因:全连接层要求固定的输入维度(如4096)。 CNN支持任意尺寸输入图像的方法:(1)使用全局平均池化层或卷积层替换FC层(2)在卷积层和FC层之间加入空间金字塔池化
这里通过一个例子来讲解:
从上图我们可以看出,猫在不同的位置,输出的feature值相同,但是位置不同。对于电脑来说,特征值相同,但是特征值位置不同,那分类结果也可能不一样。而这时全连接层filter的作用就相当于我只关注图像中是否存在猫,和这个猫所在位置没有关系。这样就让鲁棒性有大大增强。但同时因为空间结构特性被忽略了,所以全连接层不适合用于在方位上找Pattern的任务,比如segmentation。
激活函数
首先,我们知道神经网络模拟了人类神经元的工作机理,激活函数(Activation Function)是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式。在神经元中,输入的input经过一系列加权求和后作用于另一个函数,这个函数就是这里的激活函数。类似于人类大脑中基于神经元的模型,激活函数最终决定了是否传递信号以及要发射给下一个神经元的内容。在人工神经网络中,一个节点的激活函数定义了该节点在给定的输入或输入集合下的输出。标准的计算机芯片电路可以看作是根据输入得到开(1)或关(0)输出的数字电路激活函数。
激活函数可以分为线性激活函数(线性方程控制输入到输出的映射,如f(x)=x等)以及非线性激活函数(非线性方程控制输入到输出的映射,比如Sigmoid、Tanh、ReLU、LReLU、PReLU、Swish 等)。这里来解释下为什么要使用激活函数?因为神经网络中每一层的输入输出都是一个线性求和的过程,下一层的输出只是承接了上一层输入函数的线性变换,所以如果没有激活函数,那么无论你构造的神经网络多么复杂,有多少层,最后的输出都是输入的线性组合,纯粹的线性组合并不能够解决更为复杂的问题。而引入激活函数之后,我们会发现常见的激活函数都是非线性的,因此也会给神经元引入非线性元素,使得神经网络可以逼近其他的任何非线性函数,这样可以使得神经网络应用到更多非线性模型中。
常见的激活函数
Sigmoid函数
Sigmoid函数也叫Logistic函数,用于隐层神经元输出,取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。在特征相差比较复杂或是相差不是特别大时效果比较好。sigmoid是一个十分常见的激活函数,函数的表达式如下:
图像可参考下图。
适用场景:
1. Sigmoid 函数的输出范围是 0 到 1。由于输出值限定在 0 到1,因此它对每个神经元的输出进行了归一化;
2. 用于将预测概率作为输出的模型。由于概率的取值范围是 0 到 1,因此 Sigmoid 函数非常合适;
3. 梯度平滑,避免「跳跃」的输出值;
4. 函数是可微的。这意味着可以找到任意两个点的 sigmoid 曲线的斜率;
5. 明确的预测,即非常接近 1 或 0。
存在不足:
1. 梯度消失:Sigmoid 函数趋近 0 和 1 的时候变化率会变得平坦,也就是说,Sigmoid 的梯度趋近于 0。神经网络使用 Sigmoid 激活函数进行反向传播时,输出接近 0 或 1 的神经元其梯度趋近于 0。这些神经元叫作饱和神经元。因此,这些神经元的权重不会更新。此外,与此类神经元相连的神经元的权重也更新得很慢。该问题叫作梯度消失。因此,想象一下,如果一个大型神经网络包含 Sigmoid 神经元,而其中很多个都处于饱和状态,那么该网络无法执行反向传播。
2. 不以零为中心:Sigmoid 输出不以零为中心的,,输出恒大于0,非零中心化的输出会使得其后一层的神经元的输入发生偏置偏移(Bias Shift),并进一步使得梯度下降的收敛速度变慢。
3. 计算成本高昂:exp() 函数与其他非线性激活函数相比,计算成本高昂,计算机运行起来速度较慢。
tanh函数
tanh 激活函数又叫作双曲正切激活函数(hyperbolic tangent activation function)。与 Sigmoid 函数类似,Tanh 函数也使用真值,但 Tanh 函数将其压缩至-1 到 1 的区间内。与 Sigmoid 不同,Tanh 函数的输出以零为中心,因为区间在-1 到 1 之间。函数表达式:
可以发现tanh 函数可以看作放大并平移的Logistic 函数,其值域是(−1, 1)。Tanh与sigmoid的关系如下:
tanh 激活函数的图像也是 S 形,作为一个双曲正切函数,tanh 函数和 sigmoid 函数的曲线相对相似。图像可参考下图。在实践中,Tanh 函数的使用优先性高于 Sigmoid 函数。负数输入被当作负值,零输入值的映射接近零,正数输入被当作正值:
1. 当输入较大或较小时,输出几乎是平滑的并且梯度较小,这不利于权重更新。二者的区别在于输出间隔,tanh 的输出间隔为 1,并且整个函数以 0 为中心,比 sigmoid 函数更好;
2. 在 tanh 图中,负输入将被强映射为负,而零输入被映射为接近零。
与sigmoid类似,Tanh 函数也会有梯度消失的问题,因此在饱和时(x很大或很小时)也会「杀死」梯度。在一般的二元分类问题中,tanh 函数用于隐藏层,而 sigmoid 函数用于输出层,但这并不是固定的,需要根据特定问题进行调整。
ReLU激活函数
ReLU函数又称为修正线性单元(Rectified Linear Unit),是一种分段线性函数,其弥补了sigmoid函数以及tanh函数的梯度消失问题,在目前的深度神经网络中被广泛使用。ReLU函数本质上是一个斜坡(ramp)函数,公式及函数图像如下:
ReLU 函数是深度学习中较为流行的一种激活函数,相比于 sigmoid 函数和 tanh 函数,它具有如下优点:
1. 当输入为正时,导数为1,一定程度上改善了梯度消失问题,加速梯度下降的收敛速度;
2. 计算速度快得多。ReLU 函数中只存在线性关系,因此它的计算速度比 sigmoid 和 tanh 更快。
3. 被认为具有生物学合理性(Biological Plausibility),比如单侧抑制、宽兴奋边界(即兴奋程度可以非常高)
ReLU函数的不足:
1. Dead ReLU 问题。当输入为负时,ReLU 完全失效,在正向传播过程中,这不是问题。有些区域很敏感,有些则不敏感。但是在反向传播过程中,如果输入负数,则梯度将完全为零;
【Dead ReLU问题】ReLU神经元在训练时比较容易“死亡”。在训练时,如果参数在一次不恰当的更新后,第一个隐藏层中的某个ReLU 神经元在所有的训练数据上都不能被激活,那么这个神经元自身参数的梯度永远都会是0,在以后的训练过程中永远不能被激活。这种现象称为死亡ReLU问题,并且也有可能会发生在其他隐藏层。
2. 不以零为中心:和 Sigmoid 激活函数类似,ReLU 函数的输出不以零为中心,ReLU 函数的输出为 0 或正数,给后一层的神经网络引入偏置偏移,会影响梯度下降的效率。
LReLU
为了解决 ReLU 激活函数中的梯度消失问题,当 x < 0 时,我们使用 Leaky ReLU——该函数试图修复 dead ReLU 问题。函数表达式以及图像如下:
其中γ是一个很小的数,如0.1,0.01等。
为什么使用Leaky ReLU会比ReLU效果要好呢?
1. Leaky ReLU 通过把 x 的非常小的线性分量给予负输入(0.01x)来调整负值的零梯度(zero gradients)问题,当 x < 0 时,它得到0.1 的正梯度。该函数一定程度上缓解了 dead ReLU 问题
2. Leak ReLU 有助于扩大 ReLU 函数的范围,通常 a 的值为 0.01 左右;
3. Leak ReLU 的函数范围是(负无穷到正无穷)
尽管Leaky ReLU具备 ReLU 激活函数的所有特征(如计算高效、快速收敛、在正区域内不会饱和),但并不能完全证明在实际操作中Leaky ReLU 总是比 ReLU 更好。
PReLU
Leaky ReLU 是在ReLU的基础上针对存在的问题进行的扩展。除此以外也可以从其他角度进行扩展,不让 x 乘常数项,而是让 x 乘超参数,这看起来比 Leaky ReLU 效果要好,这一种扩展就是 Parametric ReLU,即为带参数的ReLU函数。函数表达式为:
其中γi是超参数,对应了 x≤0 时函数的斜率。这里引入了一个随机的超参数,它可以被学习,可以对它进行反向传播。不同神经元可以有不同的参数,其中的i对应了第i个神经元,这使神经元能够选择负区域最好的梯度,有了这种能力,它们可以变成 ReLU 或 Leaky ReLU。
如果 γi=0 ,那么PReLU 就退化为ReLU;
如果 γi 为一个很小的常数,则PReLU 可以看作Leaky ReLU;
PReLU 可以允许不同神经元具有不同的参数,也可以一组神经元共享一个参数。在很多情况下,最好使用 ReLU,但是你可以使用 Leaky ReLU 或 Parametric ReLU 进行实践,看看哪一种方式是否更适合你的问题。
Swish
Swish激活函数又叫作自门控激活函数,它由谷歌的研究者发布,数学表达式为:
β为可学习的参数或一个固定的参数,σ(x)∈(0,1)可以看作是一种软性的门控机制。当σ(β(x))接近于1时,门处于开的状态,激活函数的输出近似于x本身;当σ(β(x))接近于0时,门处于关的状态,激活函数的输出近似于0。
当β=0时,Swish函数变成线性函数x/2;
当β=1时,Swish函数在x>0时近似线性,在x<0时近似饱和,同时具有一定的非单调性;
当β➡+∞时,σ(β(x))函数趋向于离散的0-1函数,Swish函数近似为ReLU函数。
因此,Swish 函数可以看作线性函数和ReLU 函数之间的非线性插值函数,其程度由参数β控制。
softmax分类
softmax函数,又称归一化指数函数。它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。下图展示了softmax的计算方法:
首先,我们知道概率有两个性质:
1)预测的概率为非负数;
2)各种预测结果概率之和等于1。
softmax就是将在负无穷到正无穷上的预测结果按照这两步转换为概率的。下面为大家举一个例子,假如模型对一个三分类问题的预测结果为-3、1、3。我们要用softmax将模型结果转为概率。步骤如下:
1. 将预测结果转化为非负数
y1=exp(-3)≈0.05
y2=exp(1)≈2.72
y3=exp(3)≈20.09
2. 各种预测结果概率之和等于1
z1=0.05/(0.05+2.72+20.09)≈0.0022
y2=2.72/(0.05+2.72+20.09)≈0.1190
y3=20.09/(0.05+2.72+20.09)≈0.8788
AlexNet
AlexNet是第一个现代深度卷积网络模型,其首次使用了现代深度卷积网络的一些技术方法,如使用了GPU进行并行训练,采用ReLU作为非线性激活函数,适用dropout防止过拟合,使用数据增强来提高模型准确率等。AlexNet网络结构如下图所示,其中包括了5个卷积层,3个全连接层和1个softmax层。因为网络规模超过了当时单个GPU的内存限制,AlexNet将网络拆分为两半,分别放在了两个GPU上。
VGGNet
VGGNet与AlexNet相比有更小的卷积核和更深的层级。AlexNet前面几层用11×11和5×5的卷积核以在图像上获取更大的感受野,而VGGNet采用更小的卷积核与更深的网络提升参数效率。一般而言,叠加几个小的卷积核可以获得与大卷积核相同的感受野,而叠加小卷积核使用的参数明显要少于一个大的卷积核。此外,叠加小卷积核因为加深了卷积网络,能引入更强的非线性,具体如下图。
VGGNet的泛化性能较好,常用于图像特征的抽取、目标检测候选框的生成等。然而,VGGNet最大的问题在于参数数量,VGG19基本上是参数量最多的卷积网络架构。VGGNet的参数主要出现在后面两个全连接层,每一层都有4096个神经元,由此产生的参数量是巨大的。
GoogleNet
Inception网络由多个Inception模块堆叠二层。在卷积层中如何选择合适的卷积核大小是一个十分关键的问题。Inception模块采用的方法是同时使用1×1、3×3、5×5的卷积核,并将得到的特征映射拼接起来作为输入特征映射。下图给出了V1版本的Inception模块,采用了四组平行的特征抽取方式,分别为1×1、3×3、5×5的卷积核和3×3的最大池化层。同时为了提高计算效率,减少参数数量,Inception模块在进行3×3、5×5的卷积前,先进行一次1×1卷积来减少特征映射的深度。如果输入特征映射之间存在冗余信息,1×1卷积相当于先进性一次特征抽取。
Inception网络最早的V1版本就是GoogleNet,其结构如下图所示。
Inception网络有多个改进版本,其中较为有代表性的由V3版本,用多层的小卷积核来替代大的卷积核,以减少计算量和参数量。具体包括:
1. 使用两层的3×3的卷积来替换V1中的5×5的卷积;
2. 使用连续的n×1和1×n来替换原来的n×n卷积
ResNet
深度残差网路哦(ResNet)骤然将网络深度从一二十层提升到上百层。RestNet最大的特点是解决了反向传播过程中的梯度消失问题,因此它可以训练非常深的网络,而不用像GoogleNet那样在中间添加分类网络以提供额外的梯度。ResNet(Residual Network)是通过非线性的卷积层增加直连边的方式来提高信息的传播效率的。在每一个残差模块上,残差连接会将该模块的输入与输出直接相加。因此在反向传播中,根据残差连接传递的梯度就可以不经过残差模块内部的多个卷积层,因此可以保留前一层的梯度信息。此外,每一个残差模块还可以如同Inception模块那样添加1×1卷积而形成瓶颈层。这样的瓶颈结构对输入先执行降维再进行卷积运算,运算完后对卷积结果升维以恢复与输入相同的维度,这样在低维特征上进行计算可以节省很多的计算量。
上图给出了一个典型的残差单元。残差单元由多个级联的(等长)卷积层和一个跨层的直连边组成,再经过ReLU激活后得到输出。残差网络就是将多个残差单元串联起来构成的一个非常深的网络。
DenseNet
DenseNet摆脱了加深网络层数ResNet和加宽网络结构(Inception)来提升网络性能的定式思维,从特征的角度考虑,通过特征重用和旁路(bypass)重置,既大幅减少网络的参数量,又在一定程度上缓解了梯度消失问题,并且加强了特征的传递。
DenseNet是一种具有密集连接的卷积神经网络。在该网络中,任何两层之间都有直接的连接,网络每一层的输入都是前面所有层输出的并集,而该层学习的特征图也会被直接传给其后面所有层作为输入。下图是一个密集单元块的示意图,与ResNet的BottleNeck基本一致:BN-ReLU卷积(1×1) - BN-ReLU卷积(3×3),而一个DenseNet则由多个这种单元块组成。每个密集单元块之间的层称为过渡层,由BN->卷积(1×1) -> 均值池化(2×2)组成。
DenseNet是让第 i 层的输入直接影响之后的所有层,它的输出为Xi=Hi([X0, X1, X2, … , Xi-1]),其中[X0, X1, X2, … , Xi-1]将之前的特征图按照通道的维度进行合并。由于每一层都包含之前所有层的输出信息,因此只需要很少的特征图。这就是为什么DenseNet的参数量比其他模型大大减少的原因。但是密集连接仅仅是在一个密集单元块里的,密集单元块之间没有密集连接的。相邻的密集单元块之间通过卷积和池化进行操作。如下图所示。
DenseNet在训练时对内存的消耗是巨大的。DenseNet反复进行拼接操作,将之前层的输出与当前层的输出拼接到一起,然后传递给下一层。每次拼接都会开辟新的内存来保存拼接后的特征。这样就导致了L层的网络,需要消耗相当于L(L+1)/2层网络的内存(第x层的输出在内存里被存了(L-x+1)份)。
SENet
SENet的核心思想在于通过网络根据损失函数去学习特征权重,使得有效的特征图权重大,无效或效果小的特征图权重小的方式训练模型达到更好的效果。SE模块嵌在原有的一些分类网络中不可避免地增加了一些参数和计算量,但是在效果面前这种增加时可以接受的。SE模块不是一个完整的网络结构,而是一个子结构,可以灵活嵌入到其他分类或检测网络模型中。
上图是SE模块的示意图。给定一个输入X,其特征通道数为C1,通过一系列卷积等一般变换后得到一个特征通道数为C2的特征。与传统的卷积神经网络不一样的是,接下来通过三个操作来重标定前面得到的特征:
1. 首先是squeeze操作。顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数。这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野。 2. 其次是excitation操作。它是一个类似于循环神经网络中门的机制。通过参数W来为每个特征通道生成权重,其中参数W被学习用来显式地建模特征通道间的相关性。
3. 最后一个reweight操作。将excitation输出的权重看作是进行特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定。
SE模块还可以嵌入到含有短程链接(Skip-Connection)的模块中。上图是将SE嵌入到ResNet模块中的一个例子,对分支上残留的特征进行了特征重标定。目前大多数的主流网络都是基于这两种类似的单元通过重复方式叠加来构造的。由此可见,SE模块可以嵌入到现在几乎所有的网络结构中。通过在原始网络结构中嵌入SE模块,可以获取不同种类的SENet,如SE-BN-Inception、SE-ResNet、SE-ResNeXt、SE-Inception-ResNet-V2等。