GoogleNet阅读笔记

GoogleNet在ILSVRC2014比赛中脱颖而出,其创新的Inception结构允许网络深度达22层,有效提升分类和检测性能。通过1×1卷积层降维,实现了网络深度与宽度的增加,同时保持计算资源的高效利用。辅助分类器的引入增强了训练稳定性,最终模型在多项指标上刷新记录。

                                                                      Going deeper with convolutions(GoogleNet学习笔记)

原文:https://www.cs.unc.edu/~wliu/papers/GoogLeNet.pdf

摘要:
    GoogleNet在ILSVRC 2014比赛上被提出,它利用Inception结构使网络深度达到了22层,并在分类和检测上取得了新的最好的结果。这个架构的主要特点是提高了网络内部计算资源的利用率,同时在保证计算消耗不变的前提下,提升了网络的深度和广度。为了优化质量,架构的设计以Hebbian理论和多尺度处理直觉直觉为基础。(Hebbian理论描述了突触可塑性的基本原理,即突触前神经元向突触后神经元的持续重复的刺激,可以导致突触传递效能的增加。Hebbian理论在人工神经网络中的意义:突触间传递作用的变化被当作是(被映射成)神经元网络图中相应权重的变化。如果两个神经元同步激发,则它们之间的权重增加;如果单独激发,则权重减少。维基百科:https://zh.wikipedia.org/wiki/%E8%B5%AB%E5%B8%83%E7%90%86%E8%AE%BA)
1.引言
    近年来,深度学习和卷积神经网络在分类和目标检测中的发展和进步,不仅仅是硬件性能的提升、新的数据集和更深的网络的结果,而更重要的是新的想法、算法以及网络结构的改善,并且深度学习的研究重点不应该完全在精确度上面,而更应该关注于网络结构的改善。
    本文提出的Inception结构是受Network in network的启发得到的,同时作者提出要想取得更好的结果,当前的深度神经网络需要更深。在这里“深”有两层含义:(1)作者提出的Inception model是一种新的组织结构;(2)直观意义上的深,即网络层数更多。
2.相关工作
    从LeNet-5开始,CNN通常有一个标准结构-堆叠卷积层(后面可以选择接normalization和max-pooling层)后面接一个或多个全连接层。各种基于此的变种模型在MNIST、CIFAR和ImageNet分类挑战赛上都取得了很好的成绩。对于更大的数据集比如ImageNet而言,最近的趋势是增加层的数目和层的大小,同时使用Dropout来解决过拟合问题。
   受生物神经学的启发使用固定的多个Gabor滤波器来进行多尺度处理的方法,这与inception结构非常相似。但inception结构中的所有滤波器都是通过学习得到的。Inception层重复很多次,最终构成了GoogLeNet 22层的深层模型。
   通过引用Network in network中对1x1卷积的使用来增加网络深度的做法,GoogLeNet也利用了1x1卷积来进行降维和限制网络尺寸的作用。
   参考R-CNN将整个检测任务分为两个子问题的做法,即首先利用底层特征如颜色,文本等来进行提取与类别无关的proposals,然后将这些proposals放入CNN中进行训练来确定类别信息的做法。GoogleNet也借鉴这种方式,并对两个阶段都进行了改进,第一个阶段使用多边框预测以提高边界识别集合的召回率,第二个阶段则是使用更好的CNN网络结构。
3.动机与高层次的考虑
    提高深度神经网络性能最直接的方法就是增大网络的尺寸,包括深度和宽度。深度就是神经网络的层数,宽度就是每层中所用到的神经元的个数。但是这种简单直接的解决方法存在两个问题:(1)更大的尺寸通常意味着更多的参数,这会使增大的网络更容易过拟合;(2)计算资源的显著增加。
    解决上面两个问题的根本方法就是将全连接替换为稀疏连接结构。但是目前的计算设备对于非均匀的稀疏数据计算效率非常低下,即使是算术运算量减少100倍,分支预测和缓存的开销依然非常显著导致稀疏矩阵无法运用。ConvNets使用随机和特征维度的稀疏连接表,打破网络的对称性和改善学习效果,但为了更好地优化并行计算,趋势又重新回到了全连接。文章中提到将稀疏矩阵分解成稠密子矩阵进行计算加速,但同时指出稀疏矩阵在近期还不会用于深层网络的构建。 
4.架构细节
    Inception架构的主要思想就是考虑使用一个密集的网络去近似我们前面提到的那个最佳的稀疏的卷积神经网络,并在空间上不断重复这种结构。Arora等人提出了一个层级结构,对最后一层进行相关统计分析,将相关性较高的单元聚类在一起组成下一层,并连接到上一层的单元。假定我们在网络较浅层中提取的特征都是针对图像的某个部分,因此在较浅层中提取的特征主要是表达图像的局部特征。因此到最后我们能够得到图像中一个局部区域的多个特征,并把这些特征使用Conv 1*1的卷积层进行降维。同时,我们也可以使用较大的卷积核提取特征,由于卷积核增大,它对应的图像区域就会更大,因此我们就不需要使用那么多的patches,而为了避免patch-alignment,作者目前实现的inception架构中,卷积核的大小分别为1*1,3*3,5*5。作者提到的Inception架构就是将图像进行卷积后提取得到的feature map进行组合作为输出,同时作者也提到了,max pooling在卷积神经网络中也取得了很好的成果,因此除了以上提到的3中卷积核,还有使用max pooling提取的结果,结构如下图所示:

    如上图这种Inception结构的最大问题就是需要大量的计算,即使是少量的5*5的卷积也会导致计算爆炸,因为filter数量可能非常大。当pooling加进去时,问题会变得更加严重,因为pooling输出的filter数量与前一层的filter数量是一样的。pooling和其他卷积输出合并后filter数量必然会增加,而且随着inception的数量递增。因此作者提出了下图中的结构,这种改进的结构在计算可能大量增加的地方使用降维和映射。1*1的卷积被用于在3*3和5*5的卷积前和3*3的最大池化后进行降维,并且在1*1的卷积后接ReLU增加网络的非线性。(注意:这里的每个1×1卷积后面都要跟ReLU等激活函数,使得网络具有非线性)

    以上就是改进后的inception的架构,GoogleNet就是由多个上面的Inception model堆叠起来的,其中Inception model之间可能通过max pooling使得feature map大小减小(注意,这里的max pooling不是inception model中的max pooling)。作者提出,从技术层面上出发(memory efficiency),最好前几层按照正常的CNN网络的套路来,在深层的时候使用inception model,然而这也不是一定要严格遵守的。
    作者提出,使用Inception model的好处就是得益于1×1卷积层的降维,使得我们可以在不显著增加计算量的情况下增加网络的深度和宽度,使得网络具有更强的学习能力。同时根据人们的直觉感官来看,视觉信息经过不同尺度的处理结果会更好,而Inception的另一个好处就是可以提取来自不同尺度下的特征,使得下一层可以得到来自不同尺度的特征。作者最后提出,具有Inception结构的网络可以比与它具有相同识别结果但没有inception结构的网络快上3~10倍。
5.GoogleNet
    GoogleNet网络结构如下所示:

    表1为GoogLeNet的网络框图细节,其中“#3x3 reduce”,“#5x5 reduce”代表在3x3,5x5卷积操作之前使用1x1卷积的数量。在pool proj列可以看到内置的最大池化之后,投影层中1×1滤波器的数量。输入图像为224x224x3,且都进行了零均值化的预处理操作,所有卷积都是用了ReLU非线性激活函数,包括Inception模块内部的卷积。作者在最后使用average pooling代替FC层,提高了大约top-1 %0.6的准确率,然而即使在移除了全连接层之后,Dropout的使用还是必不可少的。作者使用的22层的神经网络是按照depth列中数值相加计算得到的,每个Inception算两层(因为有1×1卷积层)。
   如下图用到了辅助分类器,Inception Net有22层深,除了最后一层的输出,其中间节点的分类效果也很好。因此在Inception结构中,还使用到了辅助分类节点(auxiliary classifiers),即将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中。这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,有利于整个Inception Net的训练。通过后面的实验看出辅助的分类器作用并不明显,并且不需要两个,有一个就可以达到同样的效果。
    旁边额外的网络(包括辅助的分类器)的具体结构如下:
    * filter大小为5x5、stride为3的average pooling,对于(4a)输出大小为4x4x512,对于(4d)输出为4x4x528
    * 用于降维的1x1卷积,filter数为128,ReLU激活
    * 输出为1024的全连接层,ReLU激活
    * ratio为70%的dropout层
    * softmax损失的线性分类器(与主分类器一样预测1000个类别,但预测时移除)

6.训练方法
    训练使用异步随机梯度下降,动量参数为0.9,固定学习率(每8轮迭代学习率下降4%),Polyak平均用于生成预测时的模型。
    图像采样方法,包括各种尺寸的图像块的采样,它的尺寸均匀分布在图像区域的8%——100%之间,方向角限制为[3/4,4/3]之间。另外,作者发现Andrew Howard[8]的光度扭曲对于克服训练数据成像条件的过拟合是有用的。
7.ILSVRC14分类和检测比赛结果
    GoogleNet在ILSCRVC 2014分类和检测比赛上获得最好的成绩。

8.总结
    GoogleNet的成功证明了通过易获得的密集构造块来近似期望的最优稀疏结果是改善计算机视觉神经网络的一种可行方法,即Inception结构。GooLeNet通过使用Inception网络结构提取了图像中多个尺度的信息,也就能够提取更多的特征,而同时使用1×1大小的卷积层进行降维,使得计算量大幅降低。

参考帖子:

1.GoingDeeperwithConvolutions——GoogLeNet论文翻译——中英文对照:https://blog.youkuaiyun.com/Quincuntial/article/details/76457409?locationNum=7&fps=1

2.[深度学习] Going Deeper with Convolutions(GooLeNet)阅读笔记:https://blog.youkuaiyun.com/lhanchao/article/details/55804968?locationNum=13&fps=1

3.GoogLeNet论文学习笔记:https://blog.youkuaiyun.com/chenhoujiangsir/article/details/52400541

### CBAM简介 CBAM(Convolutional Block Attention Module)是一种轻量注意力模块,能够在空间维度和通道维度上执行注意力操作[^1]。通过引入这种机制,模型可以更加聚焦于重要的特征区域或通道,从而提升性能。 具体来说,CBAM通过对输入特征图依次施加 **通道注意力** 和 **空间注意力** 来增强特征表示能力。其核心思想在于利用简单的计算结构来捕获全局上下文信息并调整特征权重。 --- ### 使用CBAM的方法 #### 1. 渠道注意力 (Channel Attention) 渠道注意力模块会根据各个通道的重要性动态分配权重。其实现过程如下: - 首先分别对输入特征图进行全局平均池化(Global Average Pooling, GAP)和全局最大池化(Global Max Pooling, GMP),得到两种不同形式的一维向量。 - 将这两个一维向量送入共享全连接层网络中处理,最终生成对应的权值向量。 - 对上述两部分结果取逐元素相加后再经过Sigmoid激活函数获得最终的通道注意力建模结果。 ```python import torch.nn as nn class ChannelAttention(nn.Module): def __init__(self, in_planes, ratio=16): super(ChannelAttention, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) self.fc1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False) self.relu1 = nn.ReLU() self.fc2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x)))) max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x)))) out = avg_out + max_out return self.sigmoid(out) ``` #### 2. 空间注意力 (Spatial Attention) 空间注意力则侧重于捕捉图像的空间分布特性。该模块的操作流程为: - 同样采用GAP与GMP的方式提取特征图的不同统计属性; - 进一步将这些统计数据沿特定方向堆叠形成新的张量作为后续卷积运算的基础数据源; - 经过单层卷积核大小为7×7的标准二维卷积变换后输出经由sigmoid归一化的权重映射表征整个感受野内的像素关联程度。 ```python class SpatialAttention(nn.Module): def __init__(self, kernel_size=7): super(SpatialAttention, self).__init__() assert kernel_size in (3, 7), 'kernel size must be 3 or 7' padding = 3 if kernel_size == 7 else 1 self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = torch.mean(x, dim=1, keepdim=True) max_out, _ = torch.max(x, dim=1, keepdim=True) x = torch.cat([avg_out, max_out], dim=1) x = self.conv1(x) return self.sigmoid(x) ``` #### 3. 整合CBAM到CNN架构中 最后,在实际部署过程中只需简单地把构建好的`ChannelAttention`以及`SpatialAttention`组件串联起来即可完成整体框架搭建工作,并将其嵌套至任意标准残差单元内部或者独立附加于骨干网末端位置处以达到强化局部细节表达效果的目的。 ```python class CBAM(nn.Module): def __init__(self, channel_in, reduction_ratio=16, kernel_size=7): super(CBAM, self).__init__() self.channel_attention = ChannelAttention(channel_in, reduction_ratio) self.spatial_attention = SpatialAttention(kernel_size) def forward(self, x): out = self.channel_attention(x) * x out = self.spatial_attention(out) * out return out ``` --- ### 实验验证与优势分析 研究者们已经在多个经典分类任务上的基准测试集比如CIFAR系列、ImageNet等上面进行了广泛的对比试验,证明了相较于原始版本ResNets或者其他变体而言接入CBAM之后确实能够取得显著的效果增益同时保持较低额外参数开销成本不变的情况之下达成这一成就. 此外还提供了详细的消融研究进一步探讨了顺序安排对于最终表现的影响规律发现先做channel-wise再接着space-wise往往可以获得更好的综合效益指标数值水平范围之内. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值