深度学习之视觉特征提取器——GoogleNet/Inception

news2024/11/17 1:38:29

GoogleNet

GoogleNet在2014年中的ImageNet夺冠,将Inception这一结构推向了热潮。从另外一个角度来看,CV魔改网络结构也从中得到启发或者说推动,拓宽了各种魔改的方式。GoogleNet其实只是Inception这一结构大规模集成后得到的模型,Inception的发展却远不至于此。本文会详细介绍这一发展历史,从Inception v1(GooglNet) [1]到BN-Inception [2],Inception v2 [3],Inception v3 [3]直至Inception v4 [4]以及衍生出来的Xception [5].

Inception v1

请添加图片描述

上图左边是Inception v1,有图是利用1×1降维减小参数量后的Inception网络,即为GoogleNet。在Inception v1网络中,使用了不同卷积核大小的卷积进行处理,直观理解上来看,不同卷积核大小的卷积可以从不同尺寸学习图像特征,从更多方面、角度进行学习。

下图很详细地展示了GoogleNet的网络结构。具体来说,Inception相当于一种特殊的模块结构,而GoogleNet是由多种不同的Inception模块组成的,且每个Inception用1x1的卷积进行降维(具体来说是通过减小通道维度)。

请添加图片描述

此外,为了解决深层次网络在模型中间出现的梯度消失问题,额外使用了两个辅助损失函数进行训练,如下图中所示。如果上图不够直观,在原论文中也提供了一个清晰完整的模型结构图(比较长):

请添加图片描述

BN-Inception

顾名思义,这一结构是在Inception结构中引入Batch Normalization (BN)这一操作。Batch Normalization其实思想很简单,就是对每个batch进行归一化操作,具体来说,我们分别计算这一个batch中所有数据的均值和方差:
μ = 1 N ∑ i = 1 N x i , σ 2 = 1 N ∑ i = 1 N ( x i − μ ) 2 \mu=\frac{1}{N}\sum_{i=1}^{N}x_i,\sigma^2=\frac{1}{N}\sum_{i=1}^{N}(x_i-\mu)^2 μ=N1i=1Nxi,σ2=N1i=1N(xiμ)2
这相当于我们假定所有数据满足同一个正态分布 N ( μ , σ ) \N(\mu,\sigma) N(μ,σ),而归一化就是将所有数据变成标准正态分布 N ( 0 , 1 ) \N(0,1) N(0,1)。公式如下:
x i ′ ′ = x i − μ σ 2 + ϵ x_i^{''}=\frac{x_i-\mu}{\sqrt{\sigma^2+\epsilon}} xi′′=σ2+ϵ xiμ
这里 ϵ \epsilon ϵ的作用是防止方差变成0或者过小。

Inception v2

在VGG那篇博客中我们提到,将5×5的卷积分成两个3×3的卷积可以极高地提升卷积的计算效率。

请添加图片描述

上图是原始的Inception结构,我们将其中5×5的卷积换成两个3×3的卷积就变成了下图【figure 5】:

请添加图片描述

事实上,3×3的卷积可以进一步被分解成1×3的卷积和3×1的卷积的叠加,这样就可以得到如下的结构【figure 6】:

请添加图片描述

除此之外,3×3的卷积可以进一步被分解成1×3的卷积和3×1的卷积的并列,就得到了如下的结构【figure 7】:

请添加图片描述

【figure 5-7】的结构图就是Inception v2组成部分的主要结构,具体结构如下图中的表格所示:

请添加图片描述

Inception v3

Inception v3的卷积结构基本与Inception v2相同,但是在其基础上增加了许多优化点。

1-RMSProp

RMSProp(Root Mean Square Propagation)是一种优化方法,常用于深度学习中的梯度下降优化。它的目的是通过调整每个参数的学习率,来加速优化过程并提高模型训练的稳定性。RMSProp最早由Geoffrey Hinton提出。在传统的梯度下降中,每个参数都有一个固定的学习率,但在RMSProp中,每个参数的学习率是根据历史梯度的平方平均值进行调整的。通过跟踪每个参数的历史梯度平方的移动平均值,RMSProp可以动态调整每个参数的学习率,从而加速训练过程并防止梯度消失或爆炸。

RMSProp的计算过程:

  • 首先,定义一个动量因子(通常记为 γ \gamma γ)和一个非常小的数(通常是 ϵ \epsilon ϵ)来防止除零错误。
  • 初始化一个累积的平方梯度(记为 s s s),通常设为与参数相同形状的零矩阵。
  • 在每一步训练中,计算当前参数的梯度。
  • 计算累积平方梯度: s = γ ⋅ s + ( 1 − γ ) ⋅ gradient 2 s = \gamma \cdot s + (1 - \gamma) \cdot \text{gradient}^2 s=γs+(1γ)gradient2
  • 使用累积平方梯度调整学习率:学习率与 $ \sqrt{s + \epsilon} $ 反比。
  • 根据调整后的学习率来更新参数。

RMSProp的更新公式:
假设当前参数为 θ \theta θ,梯度为 g g g,学习率为 α \alpha α,累积平方梯度为 s s s,那么RMSProp的更新公式为:
s = γ ⋅ s + ( 1 − γ ) ⋅ g 2 s = \gamma \cdot s + (1 - \gamma) \cdot g^2 s=γs+(1γ)g2
θ = θ − α s + ϵ ⋅ g \theta = \theta - \frac{\alpha}{\sqrt{s + \epsilon}} \cdot g θ=θs+ϵ αg

其中:

  • γ \gamma γ 是动量因子,通常取值在 0.9 0.9 0.9 左右。
  • ϵ \epsilon ϵ 是一个小值,用于防止除零错误,通常为 1 e − 8 1e-8 1e8
  • α \alpha α 是全局学习率。

通过这种方式,RMSProp可以动态调整学习率以适应不同的参数,这有助于加快收敛速度并提高模型的训练稳定性。

2-Label Smoothing

标签平滑(Label Smoothing)是一种正则化技术,用于改善模型训练过程中的稳定性并减少模型过度自信的问题。它通过在目标标签上引入一些随机噪声来实现。这种方法在目标标签中进行平滑,使得模型在预测时更加谨慎和鲁棒。

  • 目标标签的转换:在标准的分类任务中,真实标签通常是一个one-hot编码(例如,三分类问题中,类别2的真实标签为[0, 0, 1])。标签平滑将这个one-hot编码进行平滑处理。对于给定的真实标签y,我们将目标标签q(k|x) = δk,y转换为平滑后的分布q'(k|x)
    q ′ ( k ∣ x ) = ( 1 − ϵ ) ⋅ δ k , y + ϵ ⋅ u ( k ) q'(k|x) = (1 - \epsilon) \cdot δk,y + \epsilon \cdot u(k) q(kx)=(1ϵ)δk,y+ϵu(k)
    这里, ϵ \epsilon ϵ 是平滑参数(通常是一个小的值,比如0.1),表示将真实标签转变为平滑标签的比例。 u ( k ) u(k) u(k) 是一个固定的分布,比如均匀分布u(k) = 1/K(这里, K K K 是类别数量)。

  • 交叉熵损失:模型训练的目标是最小化交叉熵损失。标准的交叉熵损失计算方式为:
    ℓ = − ∑ k = 1 K q ′ ( k ∣ x ) ⋅ log ⁡ p ( k ∣ x ) , \ell = -\sum_{k=1}^{K} q'(k|x) \cdot \log p(k|x), =k=1Kq(kx)logp(kx),
    其中 p ( k ∣ x ) p(k|x) p(kx) 是模型对类别k的预测概率,q'(k|x)是平滑后的目标标签。

  • 损失的分解:交叉熵损失可以分解为两个部分:

    • ( 1 − ϵ ) ⋅ H ( q , p ) (1 - \epsilon ) \cdot H(q, p) (1ϵ)H(q,p):这是标准交叉熵损失,其中q是原始的one-hot编码标签。
    • ϵ ⋅ H ( u , p ) \epsilon \cdot H(u, p) ϵH(u,p):这是一个新损失项,衡量预测分布p与固定分布u(通常是均匀分布)之间的差异。

通过这种方式,标签平滑在原始标签与固定分布之间引入了一种平衡。这一过程有助于模型在训练过程中不对特定类别过于自信,从而提高模型的稳定性和泛化能力。

3-Batch Normalization

在BN-Inception进行过介绍,这里特指的是对辅助分类器也使用BN归一化。

4-分解7×7卷积

将模型一开始使用的7×7卷积分解成一系列3×3卷积。

Inception v4 / Inception-ResNet

与Inception v4同一篇论文提出的是Inception-ResNet v1和Inception-ResNet v2。整体上来看,Inception-ResNet v1和Inception-ResNet v2就是在Inception结构中增加了ResNet结构,此外Inception v4在Inception v3基础上结构更加复杂了一些,并没有太多新增的理论,详细可以查阅论文《Inception-v4, inception-resnet and the impact of residual connections on learning》

Xception

Xception来自论文《Xception: Deep Learning with Depthwise Separable Convolutions》,取义自Extreme Inception,通俗理解起来就是Inception结构中的极端情况,并结合了深度可分离卷积。(深度可分离卷积并不是这篇论文中提出的,而是Xception助推了其应用)下图是Xception的基本结构图【最极致的版本】,每个通道用一个独立的3×3卷积进行处理,并将结果进行拼接,而Xception其它结构则是位于Inception和这个最极致版本的结构之间。这样做的原理是,卷积时将通道和空间卷积分离会更好。Xception的1x1卷积作用于通道,3x3卷积同时作用于通道和空间,没有做到完全分离。所以Xception让3x3卷积只作用于一个通道的特征图,从而实现了完全分离。此举不仅可以提升性能,而且可以降低参数量。

请添加图片描述

Xception与深度可分离卷积并不是完全一致的(思想一样),其不同之处在于:

  1. 深度可分离卷积先对通道进行卷积再1x1卷积,而Xception先1x1卷积,再对通道卷积。
  2. 深度可分离卷积两个卷积间不带激活函数,Xception会经过ReLU。

代码实现

Pytorch中的torchvision库可以直接调用GoogleNet和Inceptionv3:

WeightAcc@1Acc@5ParamsGFLOPSRecipe
GoogLeNet_Weights.IMAGENET1K_V169.77889.536.6M1.5link
Inception_V3_Weights.IMAGENET1K_V177.29493.4527.2M5.71link
import torch.nn as nn
import torchvision.models as models
from torchvision.models.googlenet import GoogleNet_Weights
from torchvision.models.inception import Inception_v3_Weights

class GoogleNet(nn.Module):
    def __init__(self):
        super(GoogleNet, self).__init__()
        self.googlenet = models.googlenet(weights=GoogleNet_Weights.IMAGENET1K_V1)
        self.dim_feat = 1000
        self.googlenet.classifier[2] = nn.Linear(4096, 1000)

    def forward(self, x):
        output = self.googlenet(x)
        return output
    
class Inceptionv3(nn.Module):
    def __init__(self):
        super(Inceptionv3, self).__init__()
        self.inception = models.inception(weights=Inception_v3_Weights.IMAGENET1K_V1)
        self.dim_feat = 1000
        self.inception.classifier[2] = nn.Linear(4096, 1000)

    def forward(self, x):
        output = self.inception(x)
        return output

在timm库中有其它Inception模型,可以通过huggingface (Inception v3)找到:

model = timm.create_model('inception_v3', pretrained=True, num_classes=NUM_FINETUNE_CLASSES)

总结

从Inception最初提出到Xception,网络深度和网络宽度都不断增加。深度方面,出现了由多层卷积组成的子模块,多层子模块再构成的主模块,此外还利用残差连接的方式缓解梯度消失,为深层网络的应用提供可能。宽度方面,利用不同卷积核处理原始特征,并将处理后的特征进行拼接,其样式更加丰富。整体来说,虽然从单独一个模块的角度来说利用深度可分离卷积等方法使得训练速度加快,但是由于网络深度加深整体运行速度会变慢。

[1] Szegedy, Christian, et al. “Going deeper with convolutions.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2015.

[2] Ioffe, Sergey, and Christian Szegedy. “Batch normalization: Accelerating deep network training by reducing internal covariate shift.” ICML. 2015.

[3] Szegedy, Christian, et al. “Rethinking the inception architecture for computer vision.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2016.

[4] Szegedy, Christian, et al. “Inception-v4, inception-resnet and the impact of residual connections on learning.” Thirty-First AAAI Conference on Artificial Intelligence. 2017.

[5] Chollet, François. “Xception: Deep learning with depthwise separable convolutions.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2017.

tion: Deep learning with depthwise separable convolutions." Proceedings of the IEEE conference on computer vision and pattern recognition. 2017.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1658351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

堆的应用1——堆排序

一,堆排序 堆排序是一种基于比较的排序算法,它利用堆这种数据结构所设计。 堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父结点。 堆排序可以分为两…

【python】模拟巴特沃斯滤波器

巴特沃斯滤波器(Butterworth Filter),以其设计者斯蒂芬巴特沃斯(Stephen Butterworth)的名字命名,是一种具有平滑频率响应的滤波器。这种滤波器在频域中具有非常平坦的无波纹响应,直到它达到截止…

Linux(openEuler、CentOS8)企业内网DHCP服务器搭建(固定Mac获取指定IP)

----本实验环境为openEuler系统<以server方式安装>&#xff08;CentOS8基本一致&#xff0c;可参考本文&#xff09;---- 目录 一、知识点二、实验&#xff08;一&#xff09;为服务器配置网卡和IP&#xff08;二&#xff09;为服务器安装DHCP服务软件&#xff08;三&a…

iOS 17 / iPad OS 17屏蔽更新

iOS 17 / iPad OS 17屏蔽更新 1&#xff0c;进入屏蔽iOS更新的描述文件下载链接 下载链接 wx 搜索 Geek 前端发送屏蔽更新进行获取 2&#xff0c;复制这段链接&#xff0c;在Safari浏览器中打开&#xff0c;注意打开后别点击下载&#xff01;要先改时间&#xff01; 3&#…

实例分割——Mask R-CNN、YOLOV8、RTMDET、DeepLab四种实例分割算法比对

1.概述 1.1 语义分割与实例分割 实例分割和语义分割都是计算机视觉领域中图像分割的任务&#xff0c;它们在目标和方法上有一些区别&#xff1a; 语义分割&#xff1a; 语义分割的目标是对图像中的每个像素打上类别标签&#xff0c;即识别出图像中每个像素属于哪个预定义的…

Redis简介和数据结构

目录 简介 进入之后身份认证才能使用 优点 用途&#xff1a; 数据结构 string string自动扩容 Redis中的简单动态字符串&#xff08;SDS&#xff09;具有以下优点&#xff1a; SDS数据的编码格式 比较&#xff1a; string 常用操作 分布式锁 使用情况&#xff0c;…

算法day03

第一题 179. 查找总价格为目标值的两个商品 本题采用前后指针和单调性规律可解&#xff1b; 解题思路如下&#xff1a; 1、设置前后指针 2、前后指针所指的两数之和大于目标数&#xff0c;右指针左移&#xff1b; 前后指针所指的两数之和小于目标数&#xff0c;左指针右移&…

3D 打印为压铸行业的带来新动力

近年来&#xff0c;随着多家车企的积极引领&#xff0c;一体化压铸技术已逐渐成为汽车行业的一大趋势。该技术不仅简化了车身的制造流程&#xff0c;而且优化了供应链环节&#xff0c;成为汽车制造业中的一次创新&#xff0c;同时显著提升了经济效益。 压铸技术&#xff0c;简而…

excel中怎么跳转到指定的单元格?

也许你会有这样的需求&#xff0c;如A1单元格中显示B100这种单元格地址&#xff0c;怎么做以点一下就跳转到B100&#xff1f; 一、设置公式 B1HYPERLINK("#"&MID(CELL("FILENAME",A1),FIND("]",CELL("FILENAME",A1))1,99)&&…

echart 多表联动value为null时 tooltip 显示问题

两个图表&#xff0c;第一个有tooltip,第二个隐藏掉 两个图表的 series 如下 // ----- chart1 ----series: [{name: Union Ads,type: line,stack: Total,data: [320, 282, 391, 334, null, null, null],},{name: Email,type: line,stack: Total,data: [220, 232, 221, 234, 29…

现货黄金流程到何种程度?现货黄金在金融产品中的占比是多少?

踏入2024年以来&#xff0c;受美联储降息以及地缘局势紧张的影响&#xff0c;美元受压&#xff0c;避险情绪高涨&#xff0c;众多因素影响下黄金价格出现了强势的上涨&#xff0c;屡创历史新高。在上涨如此强劲的背景下&#xff0c;投资者希望通过黄金投资来实现资产增值。市场…

锁相环(PLL)经典书籍分享(可下载)

锁相环&#xff08;PLL&#xff09;作为一种确保系统同步的控制机制&#xff0c;广泛应用于频率合成、时钟恢复、信号调制与解调等多个方面。 探索锁相环&#xff08;PLL&#xff09;技术的深度和广度&#xff0c;最有效的途径之一便是通过专业书籍的系统学习。以下是为渴望掌…

每日OJ题_贪心算法三⑦_力扣991. 坏了的计算器

目录 力扣991. 坏了的计算器 解析代码 力扣991. 坏了的计算器 991. 坏了的计算器 难度 中等 在显示着数字 startValue 的坏计算器上&#xff0c;我们可以执行以下两种操作&#xff1a; 双倍&#xff08;Double&#xff09;&#xff1a;将显示屏上的数字乘 2&#xff1b;递…

英伟达推出视觉语言模型:VILA

NVIDIA和MIT的研究人员推出了一种新的视觉语言模型(VLM)预训练框架&#xff0c;名为VILA。这个框架旨在通过有效的嵌入对齐和动态神经网络架构&#xff0c;改进语言模型的视觉和文本的学习能力。VILA通过在大规模数据集如Coy0-700m上进行预训练&#xff0c;采用基于LLaVA模型的…

Core Impact 21.5 (Windows) - 高级渗透测试

Core Impact 21.5 (Windows) - 高级渗透测试 Fortra | Core Security Penetration testing software, Release Feb 2024 请访问原文链接&#xff1a;Core Impact 21.5 (Windows) - 高级渗透测试&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&…

多线程学习Day07

共享模型之不可变 从一个日期转换的问题开始 Slf4j(topic "c.Test1") public class Test1 {public static void main(String[] args) {SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd");for (int i 0; i < 10; i) {new Thread(() -> {…

20K薪资要什么水平?来看看25岁测试工程师的面试过程…_测试工程师薪资20k(2)

既有适合小白学习的零基础资料&#xff0c;也有适合3年以上经验的小伙伴深入学习提升的进阶课程&#xff0c;涵盖了95%以上软件测试知识点&#xff0c;真正体系化&#xff01; 由于文件比较多&#xff0c;这里只是将部分目录截图出来&#xff0c;全套包含大厂面经、学习笔记、…

无监督式学习

1.是什么&#xff1f; 无监督式学习与监督式学习**最大的区别就是&#xff1a;**没有事先给定的训练实例&#xff0c;它是自动对输入的示例进行分类或者分群&#xff1b; 优点&#xff1a;不需要标签数据&#xff0c;极大程度上扩大了我们的数据样本&#xff0c;其次不受监督信…

华为云CodeArts API专场直播来袭!——探索API全生命周期管理新趋势

API的全生命周期管理是否让你摸不清头脑&#xff1f;你是否对API的前沿技术和应用充满了好奇&#xff0c;渴望一探究竟&#xff1f; 华为云PaaS服务即将在5月10日16:00&#xff0c;为你带来一场别开生面的CodeArts API专场直播活动&#xff01; 你可以在轻松愉快的氛围中&…

Python网络编程 03 实验:FTP详解

文章目录 一、小实验FTP程序需求二、项目文件架构三、服务端1、conf/settings.py2、conf/accounts.cgf3、conf/STATUS_CODE.py4、启动文件 bin/ftp_server.py5、core/main.py6、core/server.py 四、客户端1、conf/STATUS_CODE.py2、bin/ftp_client.py 五、在终端操作示例 一、小…