YOLOv4学习

YOLOv4学习

  • 什么是 parameter aggregation?
  • 什么是 Skip-connections?
  • 正是梯度的反向传播才使得损失函数得以在训练过程中不断优化,以使得模型逐渐学习到“正确的”知识,对吗?
  • 什么是Bag-of-Freebies?什么是Bag-of-Specials?
  • Bag of freebies
    • 数据增强
    • 损失函数
  • Bag of specials
    • 注意力机制
  • 方法
    • 网络结构的选择
    • 选用的 BoF 和 BoS
    • 其余改进
      • Mosaic 数据增强方法
      • 自对抗训练(Self-Adversarial Training)方法
      • Batch Normalization (BN)
      • Cross Batch Normalization (CBN)
      • Cross mini Batch Normalization (CmBN)
  • YOLOv4 的细节
    • 什么是Class label smoothing?
    • 什么是 Mish activation?
    • 什么是 Cross-stage partial connections(CSP)?
      • (a) DenseNet
      • (b) Cross Stage Partial DenseNet (CSPDenseNet)
    • 什么是Spatial pyramid pooling SPP?
      • 示例 1: 6x6 特征图
      • 示例 2: 8x8 特征图

什么是 parameter aggregation?

在深度学习和计算机视觉中,“parameter aggregation”这个术语不是一个标准术语,因此它可能会有不同的含义,取决于具体的上下文。但一般而言,参数聚合可能涉及以下几个方面:

  1. 模型融合:

    • 在训练多个模型或者在不同时间点保存同一个模型的多个版本时,参数聚合可能指的是将这些不同模型的参数按照某种策略进行融合,以得到一个性能更优的模型。例如,在集成学习中,可能会通过平均或加权平均多个模型的参数来提高测试时的性能。
  2. 多任务学习:

    • 在多任务学习中,参数聚合可能指的是共享层的参数需要在多个任务之间进行聚合,使得模型在训练过程中能够同时学习到多个任务的相关性能。
  3. 联邦学习:

    • 在联邦学习中,参数聚合是一个关键步骤。由于数据分布在多个设备上,每个设备上的模型会在本地数据上进行训练,然后将模型参数上传到中心服务器。服务器负责将这些来自不同客户端的参数进行聚合,通常使用平均等方法,然后将聚合后的全局模型参数再分发回各个客户端。
  4. 梯度聚合:

    • 在分布式训练中,多个副本(replicas)的模型在不同的设备上独立处理不同的数据批次,并计算梯度。梯度聚合涉及将所有设备上计算出的梯度汇总起来,通常是通过求平均,以便进行全局的参数更新。
  5. 特征聚合:

    • 在某些网络架构中,特别是在处理图像或序列数据时,特征聚合可能指的是在网络的某一层中将来自先前层的特征合并,以便提高模型的表达能力。

如果你有具体的上下文或是具体的论文或资料中的“parameter aggregation”,可能需要根据那个具体的上下文来给出一个更准确的定义。

什么是 Skip-connections?

在深度学习神经网络中,Skip-connections(也称为残差连接或跳跃连接)是一种允许数据直接从网络的一个层传递到另一个层的技术。Skip-connections 的主要目的是缓解深度网络训练中的梯度消失问题,并帮助信息在网络中更有效地流动。

这种连接通常在残差网络(ResNet)结构中看到,这种结构由何恺明等人在2015年提出。在一个典型的残差块中,输入不仅通过一系列的卷积层和非线性激活函数传播,而且通过一条跳跃连接跳过这些层,直接加到层的输出上。这样,层的输出成为了输入和层处理的残差之和。

Skip-connections 有几个关键的好处:

  1. 缓解梯度消失: 在训练深度网络时,跳跃连接允许梯度直接流向较深或较浅的层,有助于维持梯度的强度,从而减少梯度消失的问题。

  2. 加速收敛: 研究表明,加入 skip-connections 可以帮助神经网络更快地收敛。

  3. 训练更深的网络: 跳跃连接使得训练深度网络变得更加可行,因为它们允许信号和梯度在无阻碍的情况下更远距离地传播。

  4. 促进特征重用: 由于输入可以直接传递到后续层,网络可以学习使用原始的输入特征,而不是仅仅依赖于抽象的高层特征。

在其他类型的网络架构中,如DenseNet,skip-connections 甚至更加密集,每个层的输出都与之前所有层的输出连接起来,从而大幅增强了特征的复用。

跳跃连接是现代深度学习网络设计中的一个重要组成部分,它们通过提供一种有效的信息和梯度流动方式,显著提高了网络的性能。

正是梯度的反向传播才使得损失函数得以在训练过程中不断优化,以使得模型逐渐学习到“正确的”知识,对吗?

是的,你的理解是正确的。在深度学习中,梯度反向传播(Backpropagation)是一种核心的算法,用于训练神经网络。它通过以下步骤工作:

  1. 前向传播(Forward Propagation):

    • 数据输入网络并通过各层传递,每一层都会对数据进行一些变换(如权重相乘和激活函数)。
    • 最终输出被用来计算损失函数,损失函数衡量的是模型预测和实际值之间的差异。
  2. 计算梯度(Gradient Computation):

    • 在网络的最后一层,计算损失函数关于输出层权重的梯度。
    • 这个梯度说明了为了减少损失,权重需要增加或减少的方向及程度。
  3. 反向传播(Backpropagation):

    • 梯度接着被传回网络的每一层,这个过程中使用链式法则来计算中间层和输入层权重的梯度。
    • 每层的梯度告诉我们如何调整权重以减少整个网络的总损失。
  4. 权重更新(Weight Update):

    • 一旦所有层的梯度都被计算出来,就使用梯度下降或其他优化算法来更新权重。
    • 更新的幅度由学习率控制,学习率决定了每次更新移动多远。

这个过程在整个训练数据集上重复多次(每次迭代叫做一个epoch),每次迭代损失函数都会逐渐减小。随着损失的减少,模型的权重调整到能够更好地拟合训练数据,从而“学习”到从输入到输出的映射。当然,重要的是要有一种机制来防止过拟合,确保模型对未见过的数据也具有良好的泛化能力。

什么是Bag-of-Freebies?什么是Bag-of-Specials?

在目标检测领域中,“Bag-of-Freebies”(BoF)和"Bag-of-Specials"(BoS)是两种提升目标检测模型性能的技术集合。

  1. Bag-of-Freebies (BoF): 这些是在训练阶段可以使用的技术,旨在通过更好的训练策略来提升模型性能,而不会增加推理阶段的计算成本。BoF 的例子包括数据增强(如随机裁剪、翻转、色彩抖动等)、标签平滑、更复杂的损失函数(如Focal Loss、GIoU Loss等)、模型正则化(如Dropout、权重衰减等)和训练策略(如学习率调度、多尺度训练等)。

  2. Bag-of-Specials (BoS): 这些是在模型架构或推理阶段应用的技术,旨在通过增加计算复杂度来提升模型性能。BoS 的例子包括特殊的网络层(如可变形卷积、注意力机制等)、更复杂的特征融合策略(如特征金字塔网络FPN、PANet等)和后处理技术(如NMS变体、Soft-NMS等)。

总的来说,Bag-of-Freebies 在不增加模型推理负担的情况下提高模型性能,而 Bag-of-Specials 通过增加模型复杂度来提高性能,这可能会增加推理时间。

在这里插入图片描述

这张图是从 YOLOv4 论文中的一个架构示意图,它展示了目标检测模型的一般结构,包括一阶段和两阶段检测器的组成部分。让我们一步步解析这个图:

  • 整体结构: 图中左侧的绿色虚线框展示了整个目标检测流程。左边的部分是输入,中间是模型的主体结构,右边是预测输出。整个结构分为两大部分:一阶段检测器(One-Stage Detector)和两阶段检测器(Two-Stage Detector)。

  • 输入(Input): 输入可以是单一图像、图像块(Patches)、图像金字塔等。图像金字塔是指通过对原始图像进行不同比例的缩放得到一系列图像,这有助于检测不同大小的目标。

  • 主干网络(Backbone): 用于特征提取的深度神经网络,比如VGG16、ResNet-50、ResNeXt-101、Darknet53等。这些网络能从输入的图像中提取有用的特征。

  • 颈部(Neck): 位于主干网络与预测层之间,用于改进和增强特征。它可能包括特征金字塔网络(FPN)、路径聚合网络(PANet)、双向FPN(Bi-FPN)等。这些结构旨在融合来自不同层次的特征,以便更好地检测各种尺度的目标。

  • 头部(Head):

    • 稠密预测(Dense Prediction): 一阶段检测器,直接从特征图上密集预测目标的位置、类别和大小,比如YOLO、SSD、RetinaNet和FCOS。
    • 稀疏预测(Sparse Prediction): 两阶段检测器,首先使用区域建议网络(RPN)生成候选区域,然后精细化这些区域的预测,比如Faster R-CNN和R-FCN。

总结一下,这张图说明了目标检测模型的基本结构和组成部分,其中包括用于不同目标检测方法的主要组件。它突出了在设计目标检测系统时的不同选择,以及这些选择对于模型性能的影响。

综上所述,一个普通的目标检测器由几个部分组成:
在这里插入图片描述

Bag of freebies

数据增强

目标检测方法中经常采用的 Bag of freebies 是数据增强。数据增强的目的是增加输入图像的可变性,使所设计的目标检测模型对来自不同环境的图像具有更高的鲁棒性。例如,光度失真和几何失真是常用的两种数据增强方法,它们无疑有利于目标检测任务。在处理光度失真时,调整图像的亮度、对比度、色调、饱和度和噪点。对于几何畸变,添加了随机缩放、裁剪、翻转和旋转。

与上述各种方法不同的是,其他一些 Bag of freebies 方法致力于解决数据集中语义分布可能存在偏差的问题。在处理语义分布偏差问题时,一个非常重要的问题是不同类别之间存在数据不平衡的问题。

损失函数

传统的目标检测器通常使用均方误差(Mean Square Error, MSE)直接对边界框(BBox)的中心点坐标和高度、宽度进行回归

Bag of specials

一般来说,这些插件模块是为了增强模型中的某些属性,如扩大接受野、引入注意机制或增强特征集成能力等,后处理是对模型预测结果进行筛选的一种方法。

可用于增强感受野的常用模块有SPP、ASPP和RFB。

注意力机制

物体检测中常用的注意模块主要分为通道型注意 (channel-wise attention) 和点型注意 (point-wise attention),这两种注意模型的代表分别是(Squeeze-and-Excitation, SE)和空间注意模块(Spatial attention module, SAM)。 SE 模块可以提高ResNet50在ImageNet图像分类任务中1% top-1的准确率,代价仅仅只增加2%的计算量,但在GPU上通常会增加10%左右的推理时间,因此更适合在移动设备上使用。而对于SAM,它只需要额外支付0.1%的计算,就可以在ImageNet图像分类任务上提高ResNet50-SE 0.5%的top-1准确率。最重要的是,它完全不会影响GPU上的推理速度

通道注意力和点注意力机制的对比

在深度学习的物体检测中,注意力(attention)机制可以帮助模型专注于图像中的重要特征,并抑制不那么重要的信息。通道型注意力(channel-wise attention)和点型注意力(point-wise attention)是两种实现这一目标的方法。

  1. 通道型注意(Channel-wise Attention):

    • 通道型注意力机制关注的是如何在特征图的通道维度上赋予权重,即它评估每个通道的重要性。
    • 其代表是 Squeeze-and-Excitation (SE) 模块。SE 模块通过全局平均池化来压缩每个通道的空间维度,生成一个描述全局分布的通道描述符。然后,通过两层全连接层(一层压缩,一层再扩展)来学习通道之间的非线性关系,输出通道的重要性权重。最后,这些权重与原始特征图相乘,从而进行重新校准,强化了有用的特征并抑制了不重要的特征。
  2. 点型注意(Point-wise Attention):

    • 点型注意力机制关注的是如何在特征图的空间维度上赋予权重,也就是评估图像中每个位置的重要性
    • 空间注意模块(Spatial Attention Module, SAM)是这一机制的典型代表。SAM一般通过计算特征图的空间维度上的注意力分布来实现,可以通过对特征图进行卷积操作获得一个空间注意力图,该注意力图有与原始特征图相同的宽度和高度。在得到注意力图之后,通过这个注意力图来加权原始的特征图,使模型能够专注于更有信息的区域。

通道型注意力和点型注意力在不同的维度上关注特征图,前者聚焦于通道间的相关性,后者聚焦于空间位置的重要性。这两种注意力机制可以独立使用,也可以组合使用,以在物体检测等任务中提高模型的性能和泛化能力。通过这种方式,注意力机制可以帮助模型更有效地从输入数据中提取有用的特征,从而提高其在复杂视觉任务中的准确性。

在特征集成方面,早期的做法是使用 skip connection 或 hyper-column 将低级物理特征集成到高级语义特征。

基于深度学习的目标检测中常用的后处理方法是NMS,它可以过滤掉对同一目标预测不好的bbox,只保留响应较高的候选bbox。

方法

基本目标是神经网络在生产系统中的快速运行和并行计算的优化,而不是低计算量的理论指标(BFLOP)。作者提出了两种实时神经网络的选择:

网络结构的选择

目标是在输入网络分辨率、卷积层数、参数数( f i l t e r _ s i z e 2 filter\_size^2 filter_size2 * f i l t e r s filters filters * c h a n n e l / g r o u p s channel / groups channel/groups)和输出层数(filters)之间找到最佳平衡。

下一个目标是选择额外的模块来增加接收野,并从不同的 backbone 级别为不同的检测器级别选择参数聚合的最佳方法:例如FPN, PAN, ASFF, BiFPN。

对分类而言最优的参考模型对于检测器来说并不总是最优的。与分类器相比,检测器需要满足以下要求:

  • 更高的输入网络大小(分辨率)-用于检测多个小尺寸对象
  • 更多的层-用于更大的感受野,以覆盖增加的输入网络大小(分辨率)
  • 更多参数 - 使模型具有更强的能力来检测单个图像中不同尺寸的多个物体

假设而言,可以假设应该选择具有更大感受野尺寸(具有更多数量的卷积层3×3)和更多参数的模型作为主干。
这一理论论证以及作者的大量实验表明,CSPDarknet53 神经网络是两者中作为检测器主干的最佳模型。

不同大小感受野的影响总结如下:

  • 感受野直到对象大小-允许查看整个对象
  • 感受野达到网络大小-允许查看对象周围的上下文
  • 感受野超过网络大小-增加图像点和最终激活之间的连接数

作者在 CSPDarknet53 上添加了 SPP 块,因为它显着增加了感受野,分离出最重要的上下文特征,并且几乎不会降低网络运行速度使用 PANet 作为不同检测器级别的不同骨干级别的参数聚合方法,而不是 YOLOv3 中使用的 FPN

最后,作者选择CSPDarknet53主干、SPP附加模块、PANet路径聚合 neck 和YOLOv3(基于锚点)的头部作为YOLOv4的架构

不使用跨 GPU 批量归一化(CGBN 或 SyncBN)或昂贵的专用设备。 这使得任何人都可以在传统的图形处理器上重现作者最先进的结果,例如 GTX 1080Ti 或 RTX 2080Ti。

选用的 BoF 和 BoS

为了改进目标检测训练,CNN通常使用以下方法:

  • 激活函数:ReLU、leaky-ReLU、parameter -ReLU、ReLU6、SELU、Swish或Mish
  • 边界框回归损失函数:MSE, IoU, GIoU,CIoU, DIoU
  • 数据增强:CutOut, MixUp, CutMix
  • 正则化方法:DropOut、dropppath、Spatial DropOut、DropBlock
  • Normalization of the network activations by their
    mean and variance:通 过均值和方差对网络激活进行归一化:批量归一化 (BN) 、跨 GPU 批量归一化(CGBN 或 SyncBN)、滤波器响应归一化 (FRN) 或交叉迭代批量归一化
  • Skip-connections:残差连接、加权残差连接、多输入加权残差连接或跨阶段部分连接 (CSP)

选择 DropBlock 作为正则化方法。对于归一化方法的选择,由于关注的是只使用一个GPU的训练策略,所以没有考虑syncBN

其余改进

为了使所设计的检测器更适合在单GPU上进行训练,进行了额外的设计和改进如下:

  • 介绍了一种新的数据增强镶嵌和自对抗训练(SAT)方法
  • 采用遗传算法选择最优超参数
  • 修改了一些现有的方法,使得作者的模型设计适合于有效的训练和检测 :修改的SAM,修改的PAN和交叉小批量归一化(CmBN)。

Mosaic 数据增强方法

Mosaic数据增强是一种图像数据增强技术,它首次出现在YOLOv4目标检测算法中。这种技术通过组合多个训练图像的部分来创建一个新的合成训练样本。具体来说,它的步骤如下:

  1. 选取图像:从数据集中随机选取四张训练图像。

  2. 图像处理:将这四张图像缩放到相同的尺寸。

  3. 组合图像:在一个新的大画布上,这四张图像被随机摆放,使得它们各占一角。通常,这意味着每张图像都被切割成一半,并且组合成一个新的图像。这个过程生成的新图像会有新的组合边界框。

  4. 边界框调整:与原始图像相关联的边界框坐标需要根据它们在新图像中的位置进行调整。

Mosaic数据增强的优势在于它能够在一个训练样本中呈现多个图像的特征,并且它允许网络在单次推断中看到更多的背景变化和目标组合,这增强了模型对不同尺度目标的泛化能力。这种方法也可以模拟较小对象的检测情况,因为在合成图像中,大尺度的物体可能会被切成较小的部分。这些特性使得Mosaic数据增强成为一种有效的技术,可以提高目标检测模型在各种情况下的性能。

Mosaic 数据增强允许检测正常上下文之外的对象。 此外,批量归一化还计算每层 4 个不同图像的激活统计数据。 这显着减少了对大量 mini-batch size的需求。

自对抗训练(Self-Adversarial Training)方法

自我对抗训练(SAT)也代表了一种新的数据增强技术,它分为两个向前和向后的阶段。在第一阶段,神经网络改变原始图像,而不是改变网络权重。通过这种方式,神经网络对自己进行对抗性攻击,改变原始图像以制造图像上没有期望对象的欺骗。在第二阶段,训练神经网络以正常方式检测修改后的图像上的物体。

通俗地解释神经网络中的Batch Normalization

想象你在一个班级里快速地讲授大量新概念,学生们必须立刻理解每一个概念才能跟上后续的内容。如果这些概念一直在变化(就像在训练神经网络时每层输入的分布可能变化那样),学生们(网络层)可能很难跟上。Batch Normalization(批量归一化)就像是在每堂新课开始前,先复习一下之前的知识,确保大家都在同一起跑线上,这有助于学生们更好地理解新材料。

在神经网络中,我们通过多层传递数据,每层都会对数据做出一定的变化。如果每一层的输入数据分布都在变化,那就像是我们的学生们一直在适应新的教学方式和新概念,他们很难稳定下来。这会使得网络很难学习,因为网络需要不断适应这些变化,就像学生们需要不断适应新的教学风格。

批量归一化就是在神经网络中的每一层,标准化(即使数据分布在一个常规范围内)传递给下一层的数据。具体来说,对于网络中的每一个批量数据,我们都会计算出它们的均值和标准差,然后用这些统计数据来调整(即归一化)输入数据,使得它们的均值为零,标准差为一。

此外,批量归一化还允许每一层对这些已归一化的数据进行再缩放和平移,使得网络能够学习数据在归一化后最有用的分布。通过这种方式,批量归一化帮助网络更快地学习,因为每一层都能得到更稳定的数据分布,就像在一个稳定的教学环境下学习一样,学生们能更快地掌握知识。
在这里插入图片描述

CmBN表示CBN的修改版本,如上图所示,定义为Cross mini-Batch Normalization (CmBN)。这只收集单个批内的小批之间的统计信息。

这张配图解释了三种不同的归一化技术:Batch Normalization (BN),Cross Batch Normalization (CBN) 和 Cross mini Batch Normalization (CmBN)。

Batch Normalization (BN)

  • 操作: BN对包含四个小批次的大批次执行归一化。
  • 步骤:
    • 计算权重的累积(累积 W(t-3) 到 W(t))。
    • 根据累积的权重计算均值和方差(计算 BN(t-3) 到 BN(t))。
    • 根据这些统计量规范化 BN。
    • 最后,更新规范化层的尺度和偏移参数(ScaleShift)。

Cross Batch Normalization (CBN)

  • 操作: CBN在四个迭代间跨越执行,而不是在一个大批次内。
  • 步骤:
    • 首先更新权重(更新 W(t-3) 到 W(t))。
    • 然后累积并计算BN的均值和方差(累积并计算 BN(t-3-t0) 到 BN(t))。
    • 规范化BN。
    • 更新尺度和偏移参数。

Cross mini Batch Normalization (CmBN)

  • 操作: CmBN对包含四个小批次的每个大批次执行归一化,但是对每个小批次的均值和方差进行累积。
  • 步骤:
    • 权重的累积与上面一致(累积 W(t-3) 到 W(t))。
    • 累积每个小批次的BN统计量(累积 BN(t-3) 到 BN(t))。
    • 规范化BN。
    • 最后,只在最后一个小批次后更新权重和尺度偏移。

图中提到的"ScaleShift"指的是在BN中对每个特征通道执行的可学习的缩放(乘以 γ)和偏移(加上 β)操作。这允许模型在进行必要的规范化之后,学习恢复特征的最佳尺度和位置。

简单来说,这张图是在比较传统的BN和其两个变体在不同时间点上如何累积和使用数据统计量的。这些技术试图提高BN在处理来自不同时间点或不同小批次数据时的稳定性和性能。

在这里插入图片描述
这张图展示了空间注意模块(Spatial Attention Module, SAM)的原始版本和一个修改后的版本,如图所示,这两种模块都用于在神经网络中增强特定空间区域的特征,有助于模型更好地专注于图像中最重要的部分。现在让我们分别解释两个子图:

  1. 图(a) - 原始的SAM:

    • 输入特征图首先通过最大池化和平均池化操作,这两种池化通常用于捕捉不同的特征(如纹理细节和颜色信息)。
    • 然后,这两个池化结果通过一个卷积层来生成一个通道,以此产生空间注意力图。
    • 该注意力图经过sigmoid激活函数,使得所有值都在0到1之间,表示空间位置的重要性。
    • 最后,原始输入特征图与这个空间注意力图逐元素相乘(表示为X),从而对特征图进行加权,强调更重要的空间区域。
  2. 图(b) - 修改后的SAM:

    • 在这个修改版本中,省略了池化步骤,直接对输入特征图应用卷积操作。
    • 卷积操作后的结果同样经过sigmoid函数处理,生成空间注意力图。
    • 和原始SAM一样,这个得到的空间注意力图和输入特征图进行逐元素相乘,以增强或抑制特定区域的特征。

这个修改后的结构简化了原始的SAM,因为它移除了池化操作。这可能有助于减少计算量,并在某些情况下,通过直接学习特征图上的空间关系来提高效率和性能。不过,这样的修改是否带来性能提升需要通过实验验证。论文中可能会讨论这种修改的动机以及它对最终模型性能的具体影响。
在这里插入图片描述
这张图展示了路径聚合网络(Path Aggregation Network, PAN)的原始结构和YOLOv4论文中提出的修改后的结构。路径聚合网络用于改善特征金字塔结构中信息流的方式,它特别有助于目标检测任务中对小物体的检测。现在我们来分别看看这两种结构:

  1. 图(a) - 原始的PAN:

    • 原始的PAN使用加法操作来融合来自不同层级的特征图。在这个结构中,较低层的高分辨率特征图与较高层的低分辨率特征图相加。
    • 这种加法操作通过直接相加进行,意味着两个特征图在相加之前必须具有相同的维度。
    • 加法融合有助于将深层的语义信息与浅层的详细信息相结合,从而提高特征的表达能力。
  2. 图(a) - 修改后的PAN(图中标记应为图(b)):

    • 在修改后的PAN结构中,加法操作被替换为了连接操作(concatenation)。
    • 连接操作保留了两个特征图的所有信息,而不是将它们的值直接相加。这要求特征图在连接之前进行必要的调整,以保持相同的空间尺寸。
    • 连接操作之后通常会跟着卷积层,以便融合来自不同层的信息,并减少特征图的通道数。

这种修改可能会增加模型的参数数量和计算复杂度,因为连接操作增加了特征图的通道数,而后续的卷积层需要处理更多的输入通道。不过,这种方法也可能提高模型捕获不同特征信息的能力,尤其是在结合浅层的细节和深层的抽象特征时。在YOLOv4中,这样的修改被提出是为了改善特征的融合,进而提升检测器对各种尺度目标的检测性能。论文中可能会进一步讨论这种结构改变带来的性能提升。

YOLOv4 的细节

在这里插入图片描述

什么是Class label smoothing?

在计算机视觉中,尤其是在分类任务中,Class label smoothing 是一种防止模型过于自信,提高模型泛化能力的正则化技术。在传统的分类任务中,我们通常使用硬标签(hard labels),这意味着我们给定的目标标签是确定的,如一个图片的标签是猫,那它的标签向量就是在“猫”类别位置是1,其余位置是0。

但在训练过程中,使用硬标签可能会导致模型对于它的预测过于自信,这通常会使模型在新的或轻微变化的数据上泛化能力下降。Label smoothing 的策略就是将这些硬标签转换为柔和些的标签(soft labels)。

例如,假设我们有一个分类任务,类别数量是5,对于一个特定的实例,真实类别是第二类,那么硬标签表示就是 [0, 1, 0, 0, 0]。使用label smoothing技术,我们可以将这个硬标签转换为 [ε, 1-ε-(K-1)×ε, ε, ε, ε],其中ε是一个小的正数,K是类别的总数。这样,即使模型最确定的预测也不会是100%确定,这鼓励模型去学习更为泛化的特征,而不是仅仅拟合到训练数据的特定标签上。

Label smoothing 的效果通常体现在提升模型的泛化性上,因为它减少了模型在训练数据上的极端预测情况。这样可以在测试时对未知数据有更好的表现,尤其是在类别间边界不是特别清晰的情况下。

什么是 Mish activation?

Mish激活函数是深度学习中的一种新型激活函数,由Diganta Misra 在2019年提出。Mish函数被设计用来代替ReLU系列的激活函数,并在多种任务中显示出了良好的性能。

Mish函数的数学定义如下:

M i s h ( x ) = x ⋅ tanh ⁡ ( ln ⁡ ( 1 + e x ) ) Mish(x) = x \cdot \tanh(\ln(1 + e^x)) Mish(x)=xtanh(ln(1+ex))

这里的 tanh ⁡ \tanh tanh 是双曲正切函数, ln ⁡ ( 1 + e x ) \ln(1 + e^x) ln(1+ex) 是软加(softplus)函数的输出,它是ReLU的平滑版本。Mish函数是可微的,并且它的输出范围不是限制在 [0, ∞)(如ReLU),而是在实数域内。

Mish激活函数的特点在于它具有无上界和有下界的性质,这允许它在正值时保留一些梯度信息,同时在负值时不会完全关闭梯度(非饱和性)。这样的特性让它在正值的区间里像ReLU一样保持线性和非饱和性,有利于缓解梯度消失问题,同时在负值区间提供了更好的学习动态。

在实践中,Mish已经在一些基准测试和实际应用中显示了其对模型性能的提升,特别是在深度网络和复杂任务中。不过,由于其计算上比简单的ReLU复杂,使用Mish可能会增加训练和推理时的计算成本。

什么是 Cross-stage partial connections(CSP)?

Cross-stage partial connections (CSP) 是一种在深度学习中用于构建卷积神经网络的技术。CSP主要是为了解决随着网络深度增加,模型训练需要的内存也相应增加的问题。这种技术通过修改网络的残差连接结构来减少计算资源的需求,同时还尝试保持网络性能。

在一个标准的残差网络(如ResNet)中,一个残差块将输入特征图分为两条路径:一条通过一系列卷积层,另一条则直接作为跳跃连接(或快捷连接)。这两条路径在块的末尾被合并(通过加法)。CSP技术对此做了改进,它将输入特征图先分割成两个部分,然后只让一部分通过卷积层,而另一部分直接通过。然后,在网络的更深层再将这两部分合并。

具体地,CSP可以分为以下步骤:

  1. 分割(Split):将输入特征图分割成两个部分。
  2. 传输(Partial Transition):将其中一部分通过一个或多个卷积层。
  3. 合并(Merge):将经过卷积层的特征图与未经变换的特征图在深层合并。

CSP的优点包括:

  • 减少内存消耗:因为每次只有部分特征图通过卷积层,减少了并行计算的需求。
  • 加速训练:较低的内存消耗可以加速训练过程,因为可以使用更大的批量大小。
  • 增强学习能力:它强制网络学习更加多样化的特征表示,因为部分特征图直接跳过了卷积层的处理。

CSP被广泛应用在不同的网络架构中,包括YOLOv4目标检测模型,在其中它帮助模型在保持高精度的同时减少了计算成本。

在这里插入图片描述
在这里插入图片描述
这张对比图展示了DenseNet(Dense Convolutional Network)和CSPDenseNet(Cross Stage Partial DenseNet)两种网络结构。图中分别展示了这两种网络是如何在其层中传递和处理信息的。

(a) DenseNet

在DenseNet中,每个密集层(Dense Layer)都接收到所有之前层的特征图(通过拼接concat)作为输入。具体来说:

  • 初始特征图 X 0 X_0 X0 是输入特征图。
  • Dense Layer:每个密集层对其输入进行卷积操作,然后将卷积的输出与所有之前层的输出拼接,形成新的特征图。例如,Dense Layer 1 的输出 X 1 X_1 X1 X 0 X_0 X0 经过卷积后的结果,Dense Layer 2 的输出 X 2 X_2 X2 X 0 X_0 X0 X 1 X_1 X1 拼接后再进行卷积的结果。
  • Transition Layer:这是一个用于控制特征图大小的层,一般包含卷积操作和池化操作,用于从一个密集块转移到下一个。

DenseNet的这种设计使得每个层都可以访问之前所有层的信息,极大地促进了特征的重用,减少了参数的数量,并提高了效率。

(b) Cross Stage Partial DenseNet (CSPDenseNet)

CSPDenseNet通过修改DenseNet结构来减少计算和存储需求。具体来说:

  • 初始特征图分割 X 0 X_0 X0 被分割为两部分, X 0 ′ X_0^{'} X0 X 0 ′ ′ X_0^{''} X0′′
  • Partial Dense Block:在每个密集层中,只有一部分特征图(比如 X 0 ′ ′ X_0^{''} X0′′)参与卷积操作和拼接。其余部分( X 0 ′ X_0^{'} X0)直接传输到块的末尾,并与最后的卷积结果拼接,形成 X u X_u Xu
  • Partial Transition Layer:类似于DenseNet,但只处理 X r X_r Xr 的一部分。

CSPDenseNet的关键在于它的分割-传输-合并策略。这种方法允许网络在减少冗余计算的同时,继续保持密集连接的好处。这对于处理大规模图像或者需要较大批量大小的训练特别有用,因为它可以减少GPU内存的使用。这种结构特别适用于深度卷积网络,因为它可以有效地缩放到更多层而不增加过多的计算负担。

什么是Spatial pyramid pooling SPP?

在这里插入图片描述

Spatial Pyramid Pooling(SPP)是一种计算机视觉算法,它在卷积神经网络(CNN)的上下文中解决了一个特定问题:CNN通常要求输入图像具有固定的尺寸,但SPP层允许网络处理任意大小的输入图像。

这张图展示了空间金字塔池化(Spatial Pyramid Pooling, SPP)层的结构和工作流程。SPP层设计用于接收任意尺寸的特征图,并输出一个固定长度的特征向量,以便可以连接到全连接层。下面是这个过程的详细步骤:

  1. 特征图(Feature Maps)

    • 输入的特征图可以是任意尺寸,它是由前面的卷积层生成的。
  2. 多级池化

    • SPP层同时对特征图执行多个不同尺寸的池化操作。这在图中由三个不同大小的网格表示,通常称为金字塔池化。
    • 池化级别包括3x3、2x2和1x1,意味着每个级别将特征图划分成相应数量的区域,并在每个区域内执行最大池化。
    • 比如,3x3级别将特征图划分成3x3的网格,然后在每个网格中进行最大池化;2x2级别做相同的操作,但划分成2x2的网格,以此类推。
  3. 特征向量

    • 池化后的每个区域都会产生一个输出值,所有这些值会被展平并连接成一个长向量。这样,无论输入特征图的大小如何,输出向量的大小都是固定的。
  4. 全连接层(Full Connected)

    • SPP层的输出可以直接连接到全连接层,用于分类、回归或其他任务。
    • 这样,全连接层始终接收到相同长度的特征向量,确保了网络可以处理任意大小的输入图像。

使用SPP的好处是显而易见的:它允许卷积网络不必对输入图像大小有严格要求,增强了网络处理不同尺度对象的能力,同时也简化了网络架构的设计,因为不需要担心特征图尺寸与全连接层不匹配的问题。这种方法在一些影像识别和目标检测的网络结构中非常有用,如在Fast R-CNN中,SPP使得模型可以接受任意尺寸的输入图像并维持高效的检测性能。

在传统的CNN中,经过一系列卷积和池化层后,图像的空间尺寸逐渐减小。如果输入图像的尺寸发生变化,最终得到的特征图的尺寸也会变化,这将影响紧随其后的全连接层,因为全连接层需要固定尺寸的输入。SPP通过在全连接层之前引入一个特殊的池化层来解决这个问题。

具体来说,SPP层的工作原理如下:

  1. 不同尺寸的池化:SPP层将前面卷积层产生的特征图分成多个大小不同的区域,通常是按照金字塔形状的多级格子划分(比如1x1, 2x2, 4x4等)。对每个区域进行最大池化操作,无论它们的尺寸大小如何。

  2. 输出连接:然后,将每个区域池化后的结果展平并连接起来形成一个固定长度的向量。这样,无论原始特征图的大小如何,SPP层的输出都具有固定的维度,可以被送入全连接层。

  3. 多尺度处理:因为SPP层采用了多尺度的池化策略,所以它能捕捉到图像的空间层次信息,这对于处理多尺度或者变化尺寸的图像非常有用。

SPP的优点包括:

  • 灵活性:它允许网络处理任意大小的输入图像。
  • 鲁棒性:通过固定输出尺寸,它能够改善网络对于物体尺寸和形状的适应性。
  • 减少过拟合:多尺度池化增强了模型对局部特征的理解,有助于泛化。

SPP特别适合用于需要从图像中检测对象或者进行分类任务的场景,其中对象的尺寸和位置可能有很大变化。这种方法在一些深度学习模型中得到应用,尤其是在目标检测算法中,如Fast R-CNN。

让我们举一个例子来说明空间金字塔池化(SPP)如何确保无论输入特征图的大小如何,输出向量的大小都是固定的。

假设我们有一个SPP层,它配置有三个池化区域尺寸:1x1(全局池化),2x2,和3x3。我们将使用这个SPP层处理两个不同尺寸的输入特征图:

示例 1: 6x6 特征图

对于一个6x6的特征图,SPP层会进行以下操作:

  1. 1x1池化:这是全局池化,它会产生一个单一的值,因为它包括特征图中的所有像素。
  2. 2x2池化:6x6的特征图会被分成2x2的四个区域,每个区域3x3大小。每个区域进行最大池化后都会产生一个值,因此一共有4个值。
  3. 3x3池化:同理,特征图会被分成3x3的九个区域,每个区域2x2大小。进行最大池化后,每个区域产生一个值,共9个值。

汇总起来,对于6x6的特征图,SPP层会输出一个长度为1+4+9=14的向量。

示例 2: 8x8 特征图

接下来,对于一个8x8的特征图,SPP层会这样操作:

  1. 1x1池化:产生1个值(全局池化)。
  2. 2x2池化:8x8的特征图被分成2x2的四个区域,每个区域4x4大小。每个区域进行最大池化后产生一个值,共4个值。
  3. 3x3池化:8x8的特征图被分成3x3的九个区域,每个区域大约2.67x2.67大小。我们将每个区域进行最大池化以得到一个值,总共9个值。

所以,对于8x8的特征图,SPP层同样会输出一个长度为1+4+9=14的向量。

通过上面的两个示例可以看出,无论输入特征图的实际大小如何,只要池化区域尺寸配置保持一致,SPP层总是输出固定长度的向量。这使得后续层(如全连接层)可以处理不同尺寸的输入,而不必担心尺寸问题。这就是为什么SPP在实现上对输入图像尺寸的灵活性提供了很大的帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLM—Transformer作用及信息流

一、Transformer的作用 Transformer架构的精髓在于其创新性地采用了编码器与解码器的堆叠设计,这一设计巧妙地融合了多头自注意力机制(Multi-Head Attention)和位置前馈网络(Position-wise Feed Forward Network)两大核…

LeetCode:2312. 卖木头块(DP Java)

目录 2312. 卖木头块 题目描述: 实现代码与解析: dp 原理思路: 2312. 卖木头块 题目描述: 给你两个整数 m 和 n ,分别表示一块矩形木块的高和宽。同时给你一个二维整数数组 prices ,其中 prices[…

LLM之RAG实战(三十二)| 使用RAGAs和LlamaIndex评估RAG

在之前的文章中,我们介绍了RAG的基本流程和各种优化方法(query重写,语义分块策略以及重排序等)。那么,如果发现现有的RAG不够有效,该如何评估RAG系统的有效性呢? 在本文中,我们将介绍…

OJ_汉诺塔问题

有三根柱子和一些大小不同的圆盘,开始时所有的圆盘都按照从小到大的顺序堆叠在柱子A上,要求把所有的圆盘移动到柱子C上,但是移动过程中要满足以下规则: 每次只能移动一个圆盘。不能将一个较大的圆盘放在较小的圆盘上面。 #incl…

【工具】Docker 入门及常用指令

SueWakeup 个人主页:SueWakeup 系列专栏:为祖国的科技进步添砖Java 个性签名:保留赤子之心也许是种幸运吧 目录 1. 什么是 Docker ? 2. Docker 安装 3. Docker 镜像 4. Docker 容器 4.1 运行容器 4.2 查看正在运行的容器 4…

leetcode 714

leetcode 714 题目 例子 思路1 使用dp[n][2] 存储最佳利润值,动态规划的思路,重要的是转移方程。 代码1 class Solution { public: int maxProfit(vector& prices, int fee) { int n prices.size(); //dp[i][0] 前i天手里没有股票的最大利润 //…

Spring Bean的生命周期流程

前言 Java 中的公共类称之为Java Bean,而 Spring 中的 Bean 指的是将对象的生命周期,交给Spring IoC 容器来管理的对象。所以 Spring 中的 Bean 对象在使用时,无需通过 new 来创建对象,只需要通过 DI(依赖注入&#x…

使用光标精灵更换电脑鼠标光标样式,一键安装使用

想要让自己在使用电脑时更具个性化,让工作和娱乐更加愉快,改变你的电脑指针光标皮肤可能是一个简单而有效的方法。很多人或许并不清楚如何轻松地调整电脑光标样式,下面我就来分享一种简单的方法。 电脑光标在系统里通常只有几种默认图案&…

一次性支持 200 万字无损上下文!Kimi智能助手玩了个大的——月之暗面「登月」最新进展!

让大模型一次性无损地「吃下」一本书已经不是什么稀奇的事了,但如果我告诉你是下面👇🏻这样一本近百万字的书呢? 没错,这么疯狂的事竟然真的发生了——就在昨天月之暗面(Moonshot AI)召集了一次…

mysql 更新时,旧值与新值相同会怎么做?

文章目录 1 问题描述2 验证2.1 验证猜想12.2 验证猜想2 3 结论4 mysql 为什么这么设计呢? 1 问题描述 创建一张表t,插入一行数据 mysql> CREATE TABLE t ( id int(11) NOT NULL primary key auto_increment, a int(11) DEFAULT NULL ) ENGINEInnoDB…

9.登入页面

登入页面 在pages中新建页面login 修改代码 <template><view></view> </template><script setup></script><style lang"scss"></style>添加头像组件 官网 https://vkuviewdoc.fsq.pub/components/avatar.html …

vue:功能【xlsx】动态行内合并

场景&#xff1a;纯前端导出excel数据&#xff0c;涉及到列合并、行合并。 注&#xff09;当前数据表头固定&#xff0c;行内数据不固定。以第一列WM为判断条件&#xff0c;相同名字的那几行数据合并单元格。合并的那几行数据&#xff0c;后面的列按需求进行合并。 注&#x…

github 如何关闭 2FA

一开始按照各种教程都找不到&#xff0c;新版的太小了&#xff0c; https://github.com/settings/security

HTML实现卷轴动画完整源码附注释

动画效果截图 页面的html结构代码 <!DOCTYPE html> <html> <head lang=

【Maven入门篇】(3)依赖配置,依赖传递,依赖范围,生命周期

&#x1f38a;专栏【Maven入门篇】 &#xfeff;> &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#xfeff;> &#x1f386;音乐分享【The truth that you leave】 &#xfeff;> &#x1f970;欢迎并且感谢大家指出我的问题 文章目录 &…

(四)Android布局类型(线性布局LinearLayout)

线性布局&#xff08;LinearLayout&#xff09;&#xff1a;按照一定的方向排列组件&#xff0c;方向主要分为水平方向和垂直方向。方向的设置通过属性android:orientation设置 android:orientation 其取值有两种 水平方向&#xff1a;android:orientation"horizontal&…

【精品】递归查询数据库 获取树形结构数据 通用方法

数据库表结构 实体类基类 Getter Setter ToString public class RecursionBean {/*** 编号*/private Long id;/*** 父权限ID&#xff0c;根节点的父权限为空*/JsonIgnoreprivate Long pid;private List<? extends RecursionBean> children;/*** 递归查询子节点** param…

申请双软认证需要哪些材料?软件功能测试报告怎么获取?

“双软认证”是指软件产品评估和软件企业评估&#xff0c;其中需要软件测试报告。 企业申请双软认证除了获得软件企业和软件产品的认证资质&#xff0c;同时也是对企业知识产权的一种保护方式&#xff0c;更可以让企业享受国家提供给软件行业的税收优惠政策。 那么&#xff0c;…

奇舞周刊第522期:“Vite 又开始搞事情了!!!”

奇舞推荐 ■ ■ ■ Vite 又开始搞事情了&#xff01;&#xff01;&#xff01; Vite 的最新版本将引入一种名为 Rolldown 的新型打包工具。 unocss 究竟比 tailwindcss 快多少&#xff1f; 我们知道 unocss 很快&#xff0c;也许是目前最快的原子化 CSS 引擎 (没有之一)。 巧用…

Flink:使用 Faker 和 DataGen 生成测试数据

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…