https://arxiv.org/pdf/1709.01507.pdf
最后一届ImageNet 2017竞赛 Image Classification任务的冠军.作者采用SENet block和ResNeXt结合在ILSVRC 2017的分类项目中拿到第一,在ImageNet数据集上将top-5 error降低到2.251%,原先的最好成绩是2.991%。
提出一种有效的架构单元,“Squeeze-and-Excitation”(SE)块,它专注于通道(以往的架构注意点在网络的深度和宽度上),建模了通道间的相互依赖关系(我对通道的理解是指输出的各个Fm之间的关系),可学习地重新校准通道间的特征响应,通过将这些快堆叠在一起,构建SeNet架构。
1.对卷积神经网络的工作机制的理解:
卷积神经网络(CNNs)已被证明是解决各种视觉任务的有效模型。对于每个卷积层, 沿着输入通道学习一组滤波器来表达局部空间连接模式.。总的来说,卷积神经网络工作机制是一种受限于局部感受野的通过卷积滤波器融合空间信息和通道信息并将它们组合从而为网络效力,通过叠加一系列非线性层和下采样层交织的卷积神经网络,CNN达到了对全局感受野信息的捕获从而达到描述整个图像的目的。
2.对最近新架构/工作的分析:
1.VGGNets[35]和Inception模型[39]证明了深度增加可以获得的好处, 明显超过了ILSVRC 2014之前的方法.Inception通过嵌入学习机制来增强对空间信息相关性的捕捉从而达到提升性能的目的。最近大家的工作也在寻找更好地模拟图像空间信息依赖和空间注意力的方法。
2.批标准化(BN)[14]通过插入单元来调节层输入稳定学习过程, 改善了通过深度网络的梯度传播, 这使得可以用更深的深度进行进一步的实验.
3.He等人[9,10]表明, 通过重构架构来训练更深层次的网络是有效的, 通过使用基于恒等映射的跳连接来学习残差函数。
4.最近, 网络层间连接的重新表示[5,12]已被证明可以进一步改善深度网络的学习和表征属性.
5.另一种研究方法探索了调整网络模块化组件功能形式的方法。可以用分组卷积来增加基数(一组变换的大小)[13,43]以学习更丰富的表示。多分支卷积可以解释为这个概念的概括,使得卷积算子可以更灵活的组合[14,38,39,40]。跨通道相关性通常被映射为新的特征组合,或者独立的空间结构[6,18],或者联合使用标准卷积滤波器[22]和1×1卷积,然而大部分工作的目标是集中在减少模型和计算复杂度上面。我们的思路从这里开始,这种方法反映了一个假设,即通道关系可以被表述为具有局部感受野的实例不可知的函数的组合(即不同通道间的关系)。
3.我们专注的方向:
和别人注意的地方相反,我们专注的地方是网络的通道关系(从上面第5点得到启发),通过建模特征通道间的动态、非线性依赖关系来提高网络的表现力。当可以建模依赖关系之后,我们就可以通过某种机制重新校准特征,这样就可以达到强调有用特征并抑制无用特征的目的。
1.SE块基本结构:
对于任何给定的变换(例如卷积或一组卷积)
我们可以构造一个相应的SE块来执行特征重新校准(对变换完了的新特征进行重新校准)。如图所示。执行步骤如下:
1.特征U首先通过squeeze操作,该操作跨越空间维度W×H聚合特征映射来产生通道描述符(也就是聚合一张Fm)。这个描述符嵌入了通道特征响应的全局分布(对一张Fm的描述),使来自网络全局感受野的信息能够被其较低层利用(指这个模块的较底层部分,就是一提取完就给最近的层用)。
2.这之后是一个excitation(激励)操作,其中通过基于通道依赖性的自门机制为每个通道学习特定采样的激活,控制每个通道的激励。
3.然后特征映射U被重新加权以生成SE块的输出,然后可以将其直接输入到随后的层中。
SE网络可以通过简单地堆叠SE构建块的集合来生成。SE块也可以用作架构中任意深度的原始块的直接替换。然而,虽然构建块的模板是通用的,正如我们6.3节中展示的那样,但它在不同深度的作用适应于网络的需求。
SE快在网络不同部分的作用有所不同:
1.在前面的层中,它学习以类不可知的方式激发信息特征,增强共享的较低层表示的质量。
2.在后面的层中,SE块越来越专业化,并以高度类特定的方式响应不同的输入。
因此,SE块进行特征重新校准的好处可以通过整个网络进行累积。
2.注意力和门机制:
从广义上讲,可以将注意力视为一种工具,将可用处理资源的分配偏向于输入信号的信息最丰富的组成部分。这种机制的发展和理解一直是神经科学社区的一个长期研究领域[15,16,28],并且近年来作为一个强大补充,已经引起了深度神经网络的极大兴趣[20,25]。注意力已经被证明可以改善一系列任务的性能,从图像的定位和理解[3,17]到基于序列的模型[2,24]。它通常结合门函数(例如softmax或sigmoid)和序列技术来实现[11,37]。(Highway Networks)高速网络[36]采用门机制来调节快捷连接,使得可以学习非常深的架构。王等人[42]受到语义分割成功的启发,引入了一个使用沙漏模块[27]的强大的trunk-and-mask注意力机制。这个高容量的单元被插入到中间阶段之间的深度残差网络中。
相比之下,我们提出的SE块是一个轻量级的门机制,专门用于以计算有效的方式对通道关系进行建模,并设计用于增强整个网络中模块的表示能力。
3.SE块具体运行过程:
Squeeze-and-Excitation块是一个计算单元,可以为任何给定的变换构建(就是给某个变换结束了,对它产生的结果进行一个处理)。
为了简化说明,在接下来的表示中,我们将Ftr看作一个标准的卷积算子。V=[v1,v2,…,vC]表示学习到的一组滤波器核,vc指的是第c个滤波器的参数。然后我们可以将Ftr的输出写作U=[u1,u2,…,uC],其中
这里∗表示卷积,vc=[v1c,v2c,…,vC′c],X=[x1,x2,…,xC′](为了简洁表示,忽略偏置项)。这里vsc是2D空间核,因此表示vc的一个单通道,作用于对应的通道X。
符号描述:
即Uc表示输出的第C个通道的Fm,Vc代表在输入的第C个通道上使用的卷积核,Vsc代表该卷积核对应输入的某个通道的2D空间核。
我们的分析:
从上式不难知道输出的某个Fm是通过所有通道的和来产生的,所以通道依赖性(这里指的通道依赖性指的是上一批通道,也就是输入信号的那批通道,后面我们处理的是后面一批通道)被隐式地嵌入到vc中,而vc是滤波器(卷积核),它的作用是捕获图片像素点的空间相关性,所以我们说通道间的依赖性与滤波器捕获的空间相关性是纠缠在一起的。
4.通道间依赖关系的提取——squeeze
1.输出特征中每个通道的信号:
要找通道间信号的关系,先把他们输出。
问题:
每个通道在这里是指刚刚输出的每张Fm,所以,输出每个通道信息就是说输出每张Fm,而Fm上有很多像素点,这些像素点都是由上一步的局部感受野处理得到的,没有哪个像素点可以代表整个通道(Fm):
每个学习到的滤波器都对局部感受野进行操作,因此变换输出U的每个单元(每张Fm)都无法利用该区域之外的上下文信息。在网络较低的层次上其感受野尺寸很小,这个问题变得更严重。
解决方法:
使用全局平均池化将整个通道压缩成一个通道描述符。第c个通道(第c个Fm)表示如下:
讨论:
上一步的转换输出U可以被解释为局部描述子的集合,这些描述子的统计信息对于整个图像来说是有表现力的。特征工程工作中[31,34,45]普遍使用这些信息。我们选择最简单的全局平均池化,同时也可以采用更复杂的汇聚策略。
5.自适应重新校正(Excitation):
通过一定方式提取完了通道信息,我们就要开始利用这些通道信息了,利用他们来全面捕获通道依赖性。
能捕获通道间依赖关系的机制必须要满足下面两个条件:
1.第一,它必须是灵活的(特别是它必须能够学习通道之间的非线性交互);
2.第二,它必须学习一个非互斥的关系(non-mutually-exclusive relationship ),因为允许多个通道被强调, 相对于独热激活。(这里感觉第一条灵活的非线性交互互其实包含了第二条,第二条只是为了强调下非互斥关系)
解决方案:
为了满足这些标准,我们选择采用一个简单的门机制,并使用sigmoid激活(这里得到的标量S就相当于一会要加在输出信息U的某个Fm上的权重了):
公式参数解读:
δ是指Relu激活函數,W1和W2是用于降维和升维的两个全连接层的权重,目的是为了(1)限制模型复杂度(2)辅助模型泛化。
通过在非线性周围形成两个全连接(FC)层的瓶颈来参数化门机制,即降维层参数为W1,降维比例为r。一个ReLU,然后是一个参数为W2的升维层。
块的最终输出通过重新调节变换输出U得到:
其中X˜=[x˜1,x˜2,…,x˜C]和Fscale(uc,sc)指的是特征映射uc∈RW×H和标量sc之间的对应通道乘积。激活作为适应特定输入描述符z的通道权重。在这方面,SE块本质上引入了以输入为条件的动态特性,有助于提高特征辨别力。
6.SE结合先进架构的灵活应用
SE块的灵活性意味着它可以直接应用于标准卷积之外的变换。为了说明这一点,我们通过将SE块集成到两个流行的网络架构系列Inception和ResNet中来开发SENets。前面之所以用一个看似加一个无关的Ftr其实是现在用将它们替换为Inception和Residual模块了。
1.SE-Inception模块:
通过对架构中的每个模块进行更改,我们构建了一个SE-Inception网络。
2.SE-ResNet模块:
在这里,SE块变换Ftr被认为是残差模块的非恒等分支。压缩和激励都在恒等分支相加之前起作用。
SENet通过堆叠一组SE块来构建。实际上,它是通过用原始块的SE对应部分(即SE残差块)替换每个原始块(即残差块)而产生的。我们在表1中描述了SE-ResNet-50和SE-ResNeXt-50的架构。fc后面的内括号表示SE模块中两个全连接层的输出维度。
在实践中提出的SE块是可行的,它必须提供可接受的模型复杂度和计算开销。每个SE块利用压缩阶段的全局平均池化操作和激励阶段中的两个小的全连接层,接下来是几乎算不上计算量的通道缩放操作。
为了说明模块的成本,作为例子我们比较了ResNet-50和SE-ResNet-50,其中SE-ResNet-50的精确度明显优于ResNet-50,接近更深的ResNet-101网络(如表2所示)。对于224×224像素的输入图像,ResNet-50单次前向传播需要∼ 3.86 GFLOP。总的来说,SE-ResNet-50需要∼ 3.87 GFLOP,相对于原始的ResNet-50只相对增加了0.26%。
下图是ImageNet验证集上的单裁剪图像错误率(%)和复杂度比较。original列是指原始论文中报告的结果。为了进行公平比较,我们重新训练了基准模型,并在re-implementation列中报告分数。SENet列是指已添加SE块后对应的架构。括号内的数字表示与重新实现的基准数据相比的性能改善。†表示该模型已经在验证集的非黑名单子集上进行了评估(在[38]中有更详细的讨论),这可能稍微改善结果。在实践中,训练的批数据大小为256张图像,ResNet-50的一次前向传播和反向传播花费190 ms,而SE-ResNet-50则花费209 ms(两个时间都在具有8个NVIDIA Titan X GPU的服务器上执行)。我们认为这是一个合理的开销,因为在现有的GPU库中,全局池化和小型内积操作(最后一步乘权重)的优化程度较低。此外,由于其对嵌入式设备应用的重要性,我们还对每个模型的CPU推断时间进行了基准测试:对于224×224像素的输入图像,ResNet-50花费了164ms,相比之下,SE-ResNet-50花费了167ms。SE块所需的小的额外计算开销对于其对模型性能的贡献来说是合理的(在第6节中详细讨论)。
对SE引入的附加参数的讨论:
SE的所有附加参数其实都在其中的两个全连接层了,他们构成了网络总容量的一小部分。增加的参数的计算方法如下:
公式理解:
单个SE块增加的参数为:c*c/r + (c/r)*c=(2c^2)/r . 其中r表示减少比率(我们在所有的实验中将r设置为16),S指的是阶段数量(每个阶段是指在共同的空间维度的特征映射上运行的块的集合),Cs表示阶段s的输出通道的维度,Ns表示重复的块编号。(一个网络S个阶段,每个阶段重复N个SE块)
增加的参数分析:
总的来说,SE-ResNet-50在ResNet-50所要求的∼2500万参数之外引入了∼250万附加参数,相对增加了∼10%的参数总数量。这些附加参数中的大部分来自于网络的最后阶段(后面的Cs较大)。然而,我们发现SE块相对昂贵的最终阶段可以在性能的边际成本(ImageNet数据集上<0.1%的top-1错误率)上被移除,将相对参数增加减少到∼4%,这在参数使用是关键考虑的情况下可能证明是有用的。
1.训练过程:
1.使用随机大小裁剪[39]到224×224像素(299×299用于Inception-ResNet-v2[38]和SE-Inception-ResNet-v2)
2.随机的水平翻转
3.输入图像通过通道减去均值进行归一化
4.采用[32]中描述的数据均衡策略进行小批量采样,以补偿类别的不均匀分布
5.网络在我们的分布式学习系统“ROCS”上进行训练
6.使用同步SGD进行优化,动量为0.9,小批量数据的大小为1024(在4个服务器的每个GPU上分成32张图像的子批次,每个服务器包含8个GPU)
7.初始学习率设为0.6
8.每30个迭代周期减少10倍
9.使用[8]中描述的权重初始化策略
9.所有模型都从零开始训练100个迭代周期
2.imagenet测试:
1.验证集上的处理过程:
在验证集上使用中心裁剪图像评估来报告top-1和top-5错误率,其中每张图像短边首先归一化为256,然后从每张图像中裁剪出224×224个像素,(对于Inception-ResNet-v2和SE-Inception-ResNet-v2,每幅图像的短边首先归一化到352,然后裁剪出299×299个像素)。
2.SE块对不同深度基础网络的影响(以ResNet为例):
我们首先将SE-ResNet与一系列标准ResNet架构进行比较。每个ResNet及其相应的SE-ResNet都使用相同的优化方案进行训练。验证集上不同网络的性能如表2所示,表明SE块在不同深度上的网络上计算复杂度极小增加,始终提高性能。
结果分析:
虽然应该注意SE块本身增加了深度,但是它们的计算效率极高,即使在扩展的基础架构的深度达到收益递减的点上也能产生良好的回报。而且,我们看到通过对各种不同深度的训练,性能改进是一致的,这表明SE块引起的改进可以与增加基础架构更多深度结合使用。
3.SE块与主流架构的集成:
接下来我们将研究SE块与另外两种最先进的架构Inception-ResNet-v2[38]和ResNeXt[43]的结合效果。我们构造了这些网络的SENet等价物,SE-Inception-ResNet-v2和SE-ResNeXt(表1给出了SE-ResNeXt-50(32×4d)的配置)。像前面的实验一样,原始网络和它们对应的SENet网络都使用相同的优化方案。
我们对Inception的认识:
Inception架构将卷积模块构造为分解滤波器的多分支组合,反映了Inception假设[6],可以独立映射空间相关性和跨通道相关性。引入了先前结构化的相关性。
我们对ResNeXt的认识:
通过聚合稀疏连接(在通道维度中)卷积特征的组合来获得更丰富的表示。引入了先前结构化的相关性。
实验效果:
说明了在整个训练过程中SE块产生了一致的改进。而且,这个结果适用于残差和非残差基础。
4.在Imagenet比赛的效果:
最新的CNNs在ImageNet验证集上单裁剪图像的错误率。测试的裁剪图像大小是224×224和[10]中的320×320/299×299。与前面的工作相比,我们提出的模型SENet表现出了显著的改进。我们的获胜输入由一小群SENets组成,它们采用标准的多尺度和多裁剪图像融合策略,在测试集上获得了2.251%的top-5错误率。这个结果表示在2016年获胜输入(2.99%的top-5错误率)的基础上相对改进了∼25%。我们的高性能网络之一是将SE块与修改后的ResNeXt[43]集成在一起构建的(附录A提供了这些修改的细节)。在表3中我们将提出的架构与最新的模型在ImageNet验证集上进行了比较。我们的模型在每一张图像使用224×224中间裁剪评估(短边首先归一化到256)取得了18.68%的top-1错误率和4.47%的top-5错误率。为了与以前的模型进行公平的比较,我们也提供了320×320的中心裁剪图像评估,在top-1(17.28%)和top-5(3.79%)的错误率度量中获得了最低的错误率。
5.场景分类测试效果:
相对于分类,场景理解的任务可以更好地评估:
1.模型泛化能力
2.模型处理抽象的能力
原因:
它需要捕获更复杂的数据关联以及对更大程度外观变化的鲁棒性。
测试结果:
1.减少比率r的讨论:
公式(5)中引入的减少比率r是一个重要的超参数,它允许我们改变模型中SE块的容量和计算成本。为了研究这种关系,我们基于SE-ResNet-50架构进行了一系列不同r值的实验。表5中的比较表明,性能并没有随着容量的增加而单调上升。
原因分析:
这可能是使SE块能够过度拟合训练集通道依赖性的结果。尤其是我们发现设置r=16在精度和复杂度之间取得了很好的平衡,因此我们将这个值用于所有的实验。
实验结果:
2.激励部分作用的讨论
虽然SE块从经验上显示出其可以改善网络性能,但我们也想了解自门激励机制在实践中是如何运作的。为了更清楚地描述SE块的行为,本节我们研究SE-ResNet-50模型的样本激活,并考察它们在不同块不同类别下的分布情况。具体而言,我们从ImageNet数据集中抽取了四个类,这些类表现出语义和外观多样性,即金鱼,哈巴狗,刨和悬崖(图7中显示了这些类别的示例图像)。然后,我们从验证集中为每个类抽取50个样本,并计算每个阶段最后的SE块中50个均匀采样通道的平均激活(紧接在下采样之前),并在图8中绘制它们的分布。作为参考,我们也绘制所有1000个类的平均激活分布。
分析结果,总结3点:
1.不同类别的分布在较低层中几乎相同,例如,SE_2_3。这表明在网络的最初阶段特征通道的重要性很可能由不同的类别共享。
2.在更大的深度,每个通道的值变得更具类别特定性,因为不同类别对特征的判别性值具有不同的偏好。低层特征通常更普遍(即分类中不可知的类别),而高层特征具有更高的特异性。因此,表示学习从SE块引起的重新校准中受益,其自适应地促进特征提取和专业化到所需要的程度。
3.在网络的末端SE_5_3中(在分类器之前紧接着是全局池化),类似的模式出现在不同的类别上,尺度上只有轻微的变化(可以通过分类器来调整)。这表明,SE_5_2和SE_5_3在为网络提供重新校准方面比前面的块更不重要。这一发现与第四节实证研究的结果是一致的,这表明,通过删除最后一个阶段的SE块,总体参数数量可以显著减少,性能只有一点损失(<0.1%的top-1错误率)。
欢迎批评指正,讨论学习~
最近在github放了两份分类的代码,分别是用Tensorflow和Pytorch实现的,主要用于深度学习入门,学习Tensorflow和Pytorch搭建网络基本的操作。打算将各网络实现一下放入这两份代码中,有兴趣可以看一看,期待和大家一起维护更新。
代码地址:
Tensorflow实现分类网络
Pytorch实现分类网络