热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ConvNeXt:20年代的卷积网络

ConvNeXt:20年代的卷积网络作者:elfin  参考资料来源:ConvNeXt目录摘要一、介绍二、ConvNet的现代化:路线图2.1训练技术2.2宏观设计2.3ResNe


ConvNeXt: 20年代的卷积网络


作者:elfin  
参考资料来源:ConvNeXt

目录
  • 摘要
  • 一、介绍
  • 二、ConvNet的现代化:路线图
    • 2.1 训练技术
    • 2.2 宏观设计
    • 2.3 ResNeXt化
    • 2.4 逆瓶颈
    • 2.5 大核
    • 2.6 微观设计
  • 三、在ImageNet上面进行评估
    • 3.1 设置
    • 3.2 结论
  • 四、其他下游任务

项目地址:https://github.com/facebookresearch/ConvNeXt

论文地址:https://arxiv.org/abs/2201.03545




Top --- Bottom


摘要

​ 视觉识别的“轰鸣20年代”始于视觉transformer(VIT)的引入,它很快取代了ConvNets,成为最先进的图像分类模型。另一方面,普通ViT在应用于一般的计算机视觉任务(如目标检测和语义分割)时面临困难。正是层次transformer(例如,Swin transformer)重新引入了几个早期的ConvNet,使transformer作为一个通用的视觉中枢切实可行,并在各种视觉任务中表现出卓越的性能。然而,这种混合方法的有效性在很大程度上仍然归功于transformer的固有优势,而不是卷积固有的偏置归纳能力。在这项工作中,我们重新审视了设计空间,并测试了纯ConvNet所能达到的极限。我们逐步将标准ResNet“现代化”到视觉transformer的设计中,并发现了几个关键组件,这些组件在这一过程中会导致性能差异。这一探索的结果是一系列被称为ConvNeXt的纯ConvNet模型。ConvNeXts完全由标准的ConvNet模块构成,在精确度和可扩展性方面与Transformers竞争,达到87.8%的ImageNet top-1精确度,在COCO检测和ADE20K分割方面优于Swin Transformers,同时保持了标准ConvNet的简单性和效率。




Top --- Bottom


一、介绍

​ 回顾20世纪10年代,这十年的标志是深刻学习的巨大进步和影响。主要驱动因素是神经网络的复兴,尤其是卷积神经网络。在过去的十年里,视觉识别领域成功地从工程特征转向了设计(ConvNet)架构。尽管反向传播(back-propagation,training convnet)的发明可以追溯到20世纪80年代[39],但直到2012年底,我们才看到它在视觉特征学习方面的真正潜力。AlexNet[37]的引入催生了“ImageNet时刻”[56],开启了计算机视觉的新时代。此后,这一领域的发展速度很快。VGGNet[61]、Inceptions[64]、ResNe(X)t[26,82]、DenseNet[33]、MobileNet[32]、EfficientNet[67]和RegNet[51]等具有代表性的ConvNet专注于准确性、效率和可扩展性的不同方面,并推广了许多有用的设计

​ ConvNets在计算机视觉中的完全主导地位并非巧合:在许多应用场景中,“滑动窗口”策略是视觉处理的固有特性,尤其是在处理高分辨率图像时。ConvNet有内置的归纳偏差,使其非常适合各种计算机视觉应用。最重要的一个是平移不变性,这是目标检测等任务所需要的特性。由于以滑动窗口的方式使用时,计算是共享的,因此convnet本身也是高效的[59]。几十年来,这一直是convnet的默认使用,通常用于有限的对象类别,如数字[40]、人脸[55,71]和行人[17,60]。进入20世纪10年代,基于区域的探测器[21,22,25,54]进一步将ConvNet提升到了视觉识别系统的基础构建块的位置。

​ 与此同时,自然语言处理(NLP)神经网络设计走了一条截然不同的道路,因为transformers取代了递归神经网络,成为主导的主干架构。尽管语言和视觉领域之间的兴趣任务存在差异,但随着视觉transformer(ViT)的引入完全改变了网络体系结构设计的格局,这两条流在2020年惊人地融合在一起。除了最初的“补丁”层(将图像分割为一系列补丁)之外,ViT没有引入图像特定的偏置归纳,并且对原始NLP transformer进行了最小的更改。ViT的一个主要关注点是伸缩行为:借助更大的模型和数据集大小,Transformers可以大大超过标准Resnet。这些关于图像分类任务的结果令人鼓舞,但计算机视觉并不局限于图像分类。如前所述,过去十年中,许多计算机视觉任务的解决方案在很大程度上依赖于滑动窗口、完全卷积范式。如果没有ConvNet归纳偏差,ViT模型在被用作通用视觉主干时面临许多挑战。最大的挑战是ViT的全局注意力设计,它在输入大小方面具有二次复杂性。对于ImageNet分类来说,这可能是可以接受的,但对于更高分辨率的输入,这很快就会变得难以处理。

​ 分级transformer采用混合方法来弥补这一差距。例如,“滑动窗口”策略(例如,本地窗口内的注意力)被重新引入到transformer中,使它们的行为更类似于convnet。Swin Transformer[42]是这一方向上的一项里程碑式的工作,首次证明了Transformers可以被用作通用视觉主干,并在图像分类之外的一系列计算机视觉任务中实现最先进的性能。Swin Transformer的成功和迅速采用也揭示了一件事:卷积的本质并没有变得无关紧要;相反,它仍然是人们渴望的,从未褪色。

​ 从这个角度来看,计算机视觉transformer的许多进步都是为了恢复卷积技术栈内的瑰宝。然而,这些尝试是有代价的:滑动窗口自我注意力的一般实现可能代价高昂[52];使用shift windows等先进方法[42],可以优化速度,但系统在设计上变得更加复杂。另一方面,几乎具有讽刺意味的是,ConvNet已经满足了许多所需的属性,尽管是以一种简单、不虚饰的方式。ConvNets似乎失去动力的唯一原因是(分层)transformer在许多视觉任务中超过了它们,而性能差异通常归因于transformer优越的缩放能力、多头自我注意力。

​ 与过去十年逐步改善的ConvNets不同,视觉transformer的采用是一个渐进的变化。在最近的文献中,在比较两者时,通常采用系统级比较(例如,Swin transformer与ResNet)。ConvNet和分层transformer同时变得不同和相似:它们都配备了相似的偏置归纳,但在学习程序宏观和微观架构设计方面存在显著差异。在这项工作中,我们调查了ConvNet和Transformer之间的架构差异,并试图在比较网络性能时确定混淆变量。我们的研究旨在弥合ConvNet在ViT前和ViT后的差距,并测试纯ConvNet所能达到的极限。

​ 要做到这一点,我们先从一个标准的ResNet(例如ResNet-50)开始,然后用改进的程序进行训练。我们逐步将架构“现代化”,以构建一个层次化的视觉transformer(如SWIN-T)。我们的探索以一个关键问题为指导:transformer的设计决策如何影响ConvNet的性能?在此过程中,我们发现了几个关键组件,它们对性能差异起到了作用。因此,我们提出了一个名为ConvNeXt的纯ConvNet家族。我们评估了ConvNeXts在各种视觉任务上的表现,如ImageNet分类[15]、COCO上的目标检测/分割[41]和ADE20K上的语义分割[87]。令人惊讶的是,完全由标准ConvNet模块构建的ConvNeXts在所有主要基准测试中,在准确性、可扩展性和健壮性方面都与Transformers相媲美。ConvNeXt保持了标准ConvNets的效率,而训练和测试的完全卷积特性使其实现起来极其简单。

​ 我们希望新的观察和讨论能够挑战一些共同的信念,并鼓励人们重新思考卷积在计算机视觉中的重要性。




Top --- Bottom


二、ConvNet的现代化:路线图

​ 在本节中,我们将提供一个从ResNet到ConvNet的轨迹,该轨迹类似于transformer。我们考虑两个模型的计算量FLOPs大小,一个是ReNET-50/SWT-T,FLOPs约\(4.5 \times 10^9\),另一个是ReNET-200 / SW-B权,FLOPs约\(15 \times 10^9\)。为了简单起见,我们将用ResNet-50/Swin-T复杂度模型给出结果。高容量模型的结论是一致的,结果见附录C。

​ 在高层次上,我们的探索旨在调查和遵循Swin transformer的不同设计水平,同时保持网络作为标准ConvNet的简单性。我们探索的路线图如下。我们的出发点是ResNet-50版本。我们首先使用类似transformer的训练技术训练它,与原始的ResNet-50相比,获得了更高的效果。这将是我们的baseline。然后,我们研究了一系列设计决策,总结为:



  • 宏观设计

  • ResNeXt

  • 反向瓶颈

  • 大内核尺寸

  • 各种分层微观设计

在下图中,我们展示了“网络现代化”的每一步所能实现的过程和结果。由于网络复杂性与最终性能密切相关,在探索过程中,尽管FLOPs大致受到控制,但是FLOPs可能高于或低于参考模型。所有模型均在ImageNet-1K上进行训练和评估。



2.1 训练技术

​ 除了网络架构的设计之外,训练程序也会影响最终的性能。vision Transformers不仅带来了一组新的模块和架构设计决策,还向vision引入了不同的训练技术(例如AdamW优化器)。这主要与优化策略和相关的超参数设置有关。因此,我们探索的第一步是使用vision Transformer训练程序(在本例中为ResNet-50/200)训练基线模型。最近的一篇论文[76]展示了一套现代培训技术如何显著提高简单ResNet-50模型的性能。在我们的研究中,我们使用了一种接近DeiT[68]和Swin Transformer[42]的训练配方。培训从最初的90个时代扩展到300个时代。我们使用AdamW优化器[43],数据增强技术,如混和[85]、Cutmix[84]、RandAugment[12]、随机擦除[86],以及正则化方案,包括随机深度[33]和标签平滑[65]。我们使用的整套超参数见附录A.1。就其本身而言,这种增强的训练方法将ResNet-50模型的性能从76.1%[1]提高到了78.8%(+2.7%),这意味着传统ConvNet和视觉transformer之间的性能差异很大一部分可能是由于训练技术。在整个“现代化”过程中,我们将使用相同超参数的固定训练配方。在ResNet-50模式中,每个报告的准确度都是从三个不同的随机种子训练中获得的平均值。




Top --- Bottom


2.2 宏观设计

​ 现在,我们来分析Swin Transformers的宏网络设计。Swin Transformers遵循ConvNets[26,62]使用multi-stage设计,其中每一级具有不同的特征图分辨率。有两个有趣的设计考虑:阶段计算比率和“干细胞”结构。

改变阶段计算比率 ResNet中各阶段计算分布的原始设计主要是经验设计。stage4级旨在与目标检测等下游任务兼容,其中检测器在\(14 \times 14\)特征平面上工作。另一方面,Swin-T遵循相同的原则,但阶段计算比率略有不同,为\(1:1:3:1\)。对于较大的Swin transformer,比率为\(1:1:9:1\)。在设计之后,我们将每个阶段中的块数从ResNet-50中的\((3,4,6,3)\)调整为\((3,3,9,s3)\),这也将FLOPs与Swin-T对齐。这将模型精度从78.8%提高到79.4%。值得注意的是,研究人员已经彻底调查了计算的分布[50,51],并且可能存在一个更优化的设计。

从现在开始,我们将使用这个阶段计算比率

改变stem到补丁 通常,干细胞(stem cell)设计关注的是在网络开始时如何处理输入图像。由于自然图像固有的冗余性,在标准ConvNets和视觉transformer中,一个普通的干细胞会积极地将输入图像的采样减少到适当的特征图大小。标准ResNet中的干细胞包含一个步幅为2的\(7 \times 7\)的卷积层,然后是一个最大池化层,这导致输入图像的进行了4倍下采样。在视觉transformer中,干细胞使用了一种更积极的“patchify(修补)”策略,它对应于较大的内核大小(例如,内核大小=14或16)和非重叠卷积。Swin Transformer使用了类似的“补丁”层,但补丁大小较小,为4,以适应体系结构的多阶段设计。我们用一个步长为4的\(4 \times 4\)卷积层实现的补丁层取代了ResNet类型的干细胞。准确率从79.4%变为79.5%。这表明ResNet中的干细胞可以被一个更简单的“补丁”层替代,这将产生类似的性能。

我们将在网络中使用 补丁层(\(4 \times 4\)非重叠卷积)




Top --- Bottom


2.3 ResNeXt化

​ 在这一部分中,我们尝试采用ResNeXt[82]的思想,它比普通的ResNet具有更好的FLOPs/精度权衡。核心部分是分组卷积,其中卷积滤波器被分成不同的组。在高层次上,ResNeXt的指导原则是“使用更多组,扩大宽度”。更准确地说,ResNeXt对瓶颈块中的\(3 \times 3\) 卷积层采用分组卷积。由于这大大减少了FLOPs,网络宽度被扩展以补偿性能损失。

​ 在我们的例子中,我们使用深度卷积(参考depth-wise),这是分组卷积的一种特殊情况,其中组的数量等于通道的数量Depthwise conv已被MobileNet[32]和Exception[9]普及。我们注意到,深度卷积类似于自我注意中的加权和运算,它基于每个通道进行操作,即仅混合空间维度中的信息。深度卷积的使用有效地减少了网络故障,并如预期的那样,降低了精度。按照ResNeXt中提出的策略,我们将网络宽度增加到与Swin-T相同的通道数(从64个增加到96个)。这将使网络性能达到80.5%,当然这也导致了FLOPs的增长(5.3G)。

我们现在将采用 ResNeXt 设计




Top --- Bottom


2.4 逆瓶颈

​ 每个transformer块的一个重要设计是,它会产生一个反向瓶颈,即MLP块的隐藏尺寸比输入尺寸宽四倍(见下图)。有趣的是,这种transformer设计与ConvNets中使用的扩展比为4的反向瓶颈设计相关联。这一想法在MobileNet V2[58]中得到了推广,随后在几个先进的ConvNet体系结构[66,67]中得到了推广。

​ 在这里,我们将探讨逆瓶颈设计。上右图(a)至(b)说明了这些配置。尽管深度卷积层的FLOPs增加,但由于下采样剩余块的shortcut分支 \(1\times 1\) 卷积层中的FLOPs显著减少,这种变化将整个网络的FLOPs减少到4.6G。有趣的是,这会略微提高性能(80.5%到80.6%)。在ResNet-200/Swin-B系统中,这一步带来了更大的增益(81.9%到82.6%),同时也减少了FLOPs。

我们将会使用逆瓶颈结构




Top --- Bottom


2.5 大核

​ 在探索的这一部分中,我们重点关注大卷积核的行为。视觉transformer最独特的一个方面是它们的非局部自关注力机制,这使每一层都有一个全局感受域。虽然过去ConvNets[37,64]使用了较大的内核大小,但黄金标准(由VGGNet[62]推广)是堆叠较小的内核大小\(3 \times 3\)的卷积层,这些层在现代GPU上有高效的硬件实现[38]。尽管Swin Transformers将本地窗口重新引入了自我注意块,但窗口大小至少为7×7,明显大于ResNe(X)t内核大小3×3。在这里,我们将再次讨论卷积网络中使用大内核大小的卷积。

向前移动深度卷积层 要探索大内核,一个先决条件是向上移动depthwise conv层的位置(图3(b)到(c)。这一设计决策在transformer中也很明显:MSA块放置在MLP层之前。由于我们有一个反向瓶颈块,这是一个自然的设计选择:复杂/低效的模块(MSA、大型内核conv)将拥有较少的通道,而高效、密集的1×1层将完成繁重的工作。这个中间步骤将FLOPs减少到4.1G,导致性能暂时降低到79.9%。

增加卷积核大小 有了所有这些准备,采用更大的内核大小的卷积的好处是显著的。我们试验了几种内核大小,包括3、5、7、9和11。网络的性能从79.9%(\(3 \times 3\))提高到80.6%(\(7 \times 7\)),而网络的FLOPs大致保持不变。此外,我们还观察到,较大内核大小的好处在7×7时达到饱和点。我们在大容量模型中也验证了这种行为:当我们将内核大小增加到7×7以上时,ResNet-200模型不会显示出进一步的增益。

我们将在每个块中使用 (\(7 \times 7\)) 的深度卷积

至此,我们结束了对网络体系结构的宏观研究。有趣的是,vision Transformer中的大部分设计选择都可能映射到ConvNet实例中。




Top --- Bottom


2.6 微观设计

​ 在本节中,我们将在微观层面上研究其他几个架构差异——这里的大部分探索都是在层级别上进行的,重点是激活函数和规范化层的特定选择。

GELU替换ReLU NLP和Vision体系结构之间的一个差异是要使用哪些激活功能的细节。随着时间的推移,已经开发出了许多激活函数,但校正线性单元(ReLU)[46]由于其简单高效,仍然广泛用于卷积网络。ReLU在原始transformer论文[72]中也用作激活函数。高斯误差线性单位GELU[30],可以被认为是ReLU的一个更平滑的变体,在最先进的transformer中使用,包括谷歌的BERT[16]和OpenAI的GPT-2[49],以及最近的ViTs。我们发现,在我们的ConvNet中,ReLU也可以用GELU替代,尽管准确率保持不变(80.6%)。

更少的激活函数 Transformer和ResNet块之间的一个小区别是Transformer的激活功能较少。考虑具有key/query/value线性嵌入层、投影层和MLP块中两个线性层的transformer块。MLP块(多层感知器)中只有一个激活功能。相比之下,通常的做法是在每个卷积层(包括\(1 \times 1\) conv)上附加一个激活函数。在这里,我们研究坚持相同的策略时,性能是如何变化的。如上左图所示,我们消除了残差块中的所有GELU层,除了两个1×1层之间的一层,复制了变压器块的样式。这一过程将结果提高了0.7%至81.3%,实际上与Swin-T的性能相当。

每个块中我们都使用GELU激活函数

更少的BN层 Transformer块通常也有较少的规范化层。在这里,我们移除了两个BatchNorm(BN)层,在\(1\times 1\)层之前只留下一个BN层。这进一步将性能提升到81.4%,已经超过了Swin-T的结果。请注意,我们每个块的标准化层比Transformers更少,因为根据经验,我们发现在块的开头添加一个额外的BN层并不能提高性能。

用LN代替BN BatchNorm[35]是ConvNets中的一个重要组成部分,因为它提高了收敛性,减少了过度拟合。然而,BN还有许多复杂之处,可能会对模型的性能产生不利影响[79]。在开发替代标准化技术[57,70,78]方面已经有过无数次尝试,但BN仍然是大多数视觉任务的首选选项。另一方面,更简单的层规范化[5](LN)已在transformer中使用,在不同的应用场景中获得了良好的性能。

在原始ResNet中直接用LN代替BN将导致次优性能[78]。在对网络架构和培训技术进行了所有修改后,我们在这里重新讨论了使用LN代替BN的影响。我们观察到,我们的ConvNet模型与LN训练没有任何困难;事实上,性能稍好一些,准确率为81.5%。

每个块中我们都使用LN替换BN(参考上左图)

空间下采样层 在ResNet中,空间下采样是通过在每个阶段开始时使用步长为\(3 \times3\)(以及在shortcut连接处使用\(1 \times 1\) conv和步幅2)的卷积块实现的。在Swin transformer中,在不同stage之间添加单独的下采样层。我们探索了一种类似的策略,即使用2×2 conv层和步长2进行空间下采样。这种修改令人惊讶地导致了训练的分歧。进一步的研究表明,在空间分辨率发生变化的地方添加归一化层有助于稳定训练。其中包括几个也用于Swin transformer的LN层:每个下采样层之前一个,stem之后一个,以及最终全局平均池化之后一个。我们可以将准确度提高到82.0%,大大超过Swin-T的81.3%。

我们将使用空间下采样层。这就引出了我们的最终模型,我们称之为ConvNeXt。上左图显示了ResNet、Swin和ConvNeXt结构的比较。下表对ResNet-50、Swin-T和ConvNeXt-T的详细架构规范进行了比较。

小结 我们已经完成了我们的第一个“playthrough”,并发现了纯ConvNeXt,它可以在这种计算模式下优于在ImageNet-1K用于分类的Swin Transformer。同样值得注意的是,迄今为止讨论的设计方案都不是新颖的——在过去十年中,它们都是单独研究的,但不是集体研究的。我们的ConvNeXt模型具有与Swin Transformer大致相同的FLOPs、参数、吞吐量、内存消耗,但不需要特殊模块,如移动窗口注意力或相对位置偏差。

这些发现令人鼓舞,但尚未完全令人信服——到目前为止,我们的探索仅限于小规模,但视觉transformer的缩放行为才是它们的真正区别。此外,ConvNet能否在诸如目标检测和语义分割等下游任务上与Swin Transformers竞争是计算机视觉从业者关注的一个核心问题。在下一节中,我们将在数据和模型大小方面放大ConvNeXt模型,并在一组不同的视觉识别任务中对其进行评估。




Top --- Bottom


三、在ImageNet上面进行评估

  • ConvNeXt-T: C = (96, 192, 384, 768), B = (3, 3, 9, 3)



  • ConvNeXt-S: C = (96, 192, 384, 768), B = (3, 3, 27, 3)



  • ConvNeXt-B: C = (128, 256, 512, 1024), B = (3, 3, 27, 3)



  • ConvNeXt-L: C = (192, 384, 768, 1536), B = (3, 3, 27, 3)



  • ConvNeXt-XL: C = (256, 512, 1024, 2048), B = (3, 3, 27, 3)



首先作者设置了前四种模型,与SWIN保持一致,最后一个模型是验证ConvNeXt模型的能力。


3.1 设置

在 ImageNet-1K上训练

​ 使用AdamW训练ConvNeXt 300个epoch,初始学习率为\(0.004\)。前20个epoch使用线性warmup,之后采用余弦衰减。batch大小为4096和权重衰减参数\(0.05\)。数据增强使用了Mixup、Cutmix、RandAugment、Random Erasing。正则化有标签平滑(Label Smoothing)和随机深度(Stochastic Depth)。应用初始值1e-6的层比例[69]。我们使用指数移动平均(EMA)[48],因为我们发现它可以缓解较大模型的过度拟合。

在ImageNet-22K上预训练

​ 采用5(warmup)+85的epoch训练模式,不使用指数移动平均。其他与上面一致。

在ImageNet-1K上面微调

没有warmup,学习率为\(5e^{-5}\)的AdamW优化,学习率是余弦衰减、 layer-wise learning rate decay(分层学习率衰减)。batch大小为512,权重衰减为\(10^{-8}\)。

​ 与ViTs/SWIN相比,ConvNeXts在不同分辨率下更易于微调,因为网络是完全卷积的,无需调整输入patch大小或插值绝对/相对位置偏差。


3.2 结论



以上,可以看出ConvNeXt模型有明显的性能优势!




Top --- Bottom


四、其他下游任务

基于COCO的目标检测与实例分割


这也是ConvNeXt明显有优势!

基于ADE20K的语义分割





Top --- Bottom


完!



推荐阅读
  • Cosmos生态系统为何迅速崛起,波卡作为跨链巨头应如何应对挑战?
    Cosmos生态系统为何迅速崛起,波卡作为跨链巨头应如何应对挑战? ... [详细]
  • 独家解析:深度学习泛化理论的破解之道与应用前景
    本文深入探讨了深度学习泛化理论的关键问题,通过分析现有研究和实践经验,揭示了泛化性能背后的核心机制。文章详细解析了泛化能力的影响因素,并提出了改进模型泛化性能的有效策略。此外,还展望了这些理论在实际应用中的广阔前景,为未来的研究和开发提供了宝贵的参考。 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 每日前端实战:148# 视频教程展示纯 CSS 实现按钮两侧滑入装饰元素的悬停效果
    通过点击页面右侧的“预览”按钮,您可以直接在当前页面查看效果,或点击链接进入全屏预览模式。该视频教程展示了如何使用纯 CSS 实现按钮两侧滑入装饰元素的悬停效果。视频内容具有互动性,观众可以实时调整代码并观察变化。访问以下链接体验完整效果:https://codepen.io/comehope/pen/yRyOZr。 ... [详细]
  • 探索聚类分析中的K-Means与DBSCAN算法及其应用
    聚类分析是一种用于解决样本或特征分类问题的统计分析方法,也是数据挖掘领域的重要算法之一。本文主要探讨了K-Means和DBSCAN两种聚类算法的原理及其应用场景。K-Means算法通过迭代优化簇中心来实现数据点的划分,适用于球形分布的数据集;而DBSCAN算法则基于密度进行聚类,能够有效识别任意形状的簇,并且对噪声数据具有较好的鲁棒性。通过对这两种算法的对比分析,本文旨在为实际应用中选择合适的聚类方法提供参考。 ... [详细]
  • Git应用技巧与实战经验分享
    在使用 Git 进行代码管理时,有时会遇到无法访问 `https://github.com` 仓库的问题,具体表现为 OpenSSL SSL_read 错误,连接被重置(errno 10054)。本文将深入探讨这一问题的成因,并分享多种解决方法,包括检查网络配置、更新 Git 版本以及调整 SSL 设置等,帮助开发者有效应对类似问题。此外,文章还将介绍一些实用的 Git 技巧和实战经验,提升代码管理和协作效率。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • 观察 | 求职体验:收到录用通知的公司通常不深究技术细节,而那些详细追问的公司往往没有后续进展
    观察 | 求职体验:收到录用通知的公司通常不深究技术细节,而那些详细追问的公司往往没有后续进展 ... [详细]
  • SSL 错误:目标主机名与备用证书主题名称不匹配
    在使用 `git clone` 命令时,常见的 SSL 错误表现为:无法访问指定的 HTTPS 地址(如 `https://ip_or_domain/xxxx.git`),原因是目标主机名与备用证书主题名称不匹配。这通常是因为服务器的 SSL 证书配置不正确或客户端的证书验证设置有问题。建议检查服务器的 SSL 证书配置,确保其包含正确的主机名,并确认客户端的证书信任库已更新。此外,可以通过临时禁用 SSL 验证来排查问题,但请注意这会降低安全性。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
author-avatar
fjy69
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有