【论文精读】ConvNeXt

摘要

       Vision Transformer是当前最先进的图像分类模型,但普通ViT在应用于一般计算机视觉任务(如目标检测和语义分割)时面临困难。故后来的分层Vision Transformer(如Swin Transformer)通过引入了几种卷积网络先验,使Transformer作为通用视觉骨干实际上可行,并在各种视觉任务上表现出卓越的性能。 然而,这种混合方法的有效性在很大程度上仍然归功于Transformer的内在优越性,而不是卷积的内在归纳偏差。

       本文重新审视了设计空间,并测试了纯卷积网络所能达到的极限,通过研究ConvNets和Transformer的架构区别,来找到卷积网络和ViT性能差异的关键变量。旨在弥合ConvNets和vit之间的差距,并测试纯ConvNet可以实现的极限。具体有:

  • 本文从标准ResNet (如ResNet-50)开始,逐渐将卷积架构逼近到分层Vision Transformer(如Swin-T),逼近过程中发现了几个导致性能差异的关键组件。基于此提出了一个纯卷积网络家族,称为ConvNeXts
  • 在ImageNet分类、COCO目标检测/分割和ADE20K语义分割任务上,纯卷积结构的ConvNeXts,在准确性、可扩展性和所有主要基准的鲁棒性方面与Transformer相当,同时ConvNeXts保持了标准ConvNets的简单性和高效性
    image

       上图为ConvNeXts与ViT等在ImageNet-1K分类任务的性能对比,气泡大小正比于模型的GFLOPs。

框架

Modernizing a ConvNet: a Roadmap

       本节提供从ResNet转为ConvNeXt的轨迹,考虑两种模型大小的GFLOPs,一种是ResNet-50/Swin-T,GFLOPs约为 4.5 × 1 0 9 4.5×10^9 4.5×109,另一种是ResNet-200/Swin-B模型,GFLOPs约为 15.0 × 1 0 9 15.0×10^9 15.0×109

       从一个ResNet-50模型,首先用用于训练ViT的类似训练技术来训练它,在获得了比原始ResNet-50有很大改善的结果后,以此为基线。然后研究了一系列设计策略,包括:macro design、ResNeXt、inverted bottleneck、large kernel size、various layer-wise micro designs。
image
       上图为从ResNet到ConvNeXt每一步所能实现的过程和结果。由于网络复杂度与最终性能密切相关,在探索过程中,GFLOPs大致被控制。所有模型都在ImageNet-1K上进行训练和评估。

Training Techniques

       本文使用了类似DeiT和Swin Transformer的训练方法训练ResNets。故ResNets的训练从最初的90个epoch扩展到300个epoch。以及使用AdamW优化器,数据增强技术,如Mixup、Cutmix、RandAugment、Random Erasing和正则化方案,包括Stochastic Depth和Label Smoothing。

       这种增强的训练方法将ResNet-50的性能从76.1% 提高到78.8%(+2.7%),意味着传统卷积网络和Vision Transformer之间的性能差异很大一部分可能是由于训练方法。

       在之后的所有改进中,将基于此固定训练方法。报告的所有ResNet-50的精度都为由三个不同的随机种子训练的模型的精度的平均值。

Macro Design

       Swin Transformer遵循ConvNets使用多阶段结构,其中每个阶段具有不同的Feature Map分辨率。故考虑两个设计因素:每个阶段的计算占比(Stage Ratio)和Patchify Stem结构。

Changing stage compute ratio

       Swin-Transformer的骨干网络被分成了4个不同的Stage,每个Stage又是由若干个Block组成,Swin-T的Block的比例是(1,1,3,1),而对于更大的模型来说,这个比例是(1,1,9,1)。本文将ResNet-50的每个阶段的Block数从(3,4,6,3)调整到(3,3,9,3),以对齐Swin-T的GFLOPs。基于此,模型精度从78.8%提高到79.4%。

       后续的改进也将基于这个stage compute ratio。

Changing stem to “Patchify”

       由于自然图像中固有的信息冗余,卷积网络和Vision Transformer都会对输入图像进行降采样。标准ResNet中使用一个步幅为2的7 × 7卷积层及max池化的stem cell,对输入图像的4×下采样。Vision Transformer中则使用patchify策略,对应较大核尺寸的(14或16)非重叠卷积。Swin Transformer使用类似的patchify层,但其patch大小为4,以适应架构的多阶段设计。

       为了对齐Vision Transformer,本文将resnet的stem cell替换为由卷积核尺寸4 × 4,stride为4卷积层实现的patchify层。基于此,准确率从79.4%提高到79.5%。

       后续改进也将基于这个4×4卷积的patchify stem。

ResNeXt-ify

       ResNeXt因为使用了分组卷积(卷积滤波器被分成不同的组),因而比普通ResNet具有更好的GFLOPs/accuracy权衡。由于bottleneck block中的3 ×3卷积层全部采用分组卷积,显著减少了GFLOPs,因此可以通过扩展网络宽度来补偿容量损失。

       故本文的bottleneck block使用分组卷积的特殊情况深度卷积(组的数量等于通道的数量),其先将3 ×3卷积以通道为单位进行运算(深度卷积),然后再通过1×1卷积进行通道融合(点卷积)。3 ×3的深度卷积和1×1的点卷积导致了分离的空间混合和通道混合,这对齐了Vision Transformer的特性。

       基于此,ConvNeXt的GFLOPs从4.4降到了2.4,但其准确率从79.5%降到了78.3%。故根据ResNeXt中提出的策略,本文将网络宽度增加到与Swin-T相同的信道数量(从64增加到96),对应GFLOPs增加到5.3,网络性能达到80.5%。

       后续改进也将基于ResNeXt-ify。

Inverted Bottleneck

image
       Transformer的一个重要设计是其为中间维度小,两头维度大逆瓶颈层的架构(上图(b)),Self-Attention的维度是512,而MLP的维度是2048。逆瓶颈层由MobileNetv2普及,并在后续的卷积改进模型中相继被证明有效。

       本文的ConvNeXt也使用了逆瓶颈层的结构,虽然这导致深度卷积层的GFLOPs增加,但由于下采样残差块的1×1卷积层的GFLOPs显著减少,整个网络GFLOPs减少到4.6,而性能从80.5%提高到80.6%。

       后续改进也将基于逆瓶颈层。

Large Kernel Sizes

       Vision Transformer最独特的特性为其具有全局感受野,故本文重新审视卷积网络中大核卷积的使用。

Moving up depthwise conv layer

       要探索大型内核,首先对齐Transformer。因为Transformer的MSA块放置在MLP层之前,故本文将深度卷积层的位置进行了上移,如上图(b)到(c)。这一中间步骤将GFLOPs减少到4.1,导致性能暂时下降到79.9%。

Increasing the kernel size

image
       基于上述,本文实验了几种内核大小,包括3、5、7、9和11。对应的网络性能也从79.9%(3× 3)提高至80.6%(7×7),GFLOPs增加至4.2。

       此外,大核卷积的尺寸在7×7处达到饱和点,故ConvNeXt将使用核尺寸为7×7的深度卷积(上图右)。

Micro Design

       本节在微观尺度上进一步研究其它的架构差异,重点为激活函数和规一化层的选择。

Replacing ReLU with GELU

        在原始的Transformer中,ReLU也被用作激活函数。而在后续的改进工作如BERT、GPT2中采用GELU作激活函数。为了对齐上述改进,本文也用GELU代替原始ResNet的ReLU,尽管使用GELU后的精度依旧为80.6%。

Fewer activation functions

       一个Transformer块中,只有MLP块中使用了一个激活函数,而ResNet块的每个卷积层都会加一个激活函数。故本文也采用相同策略,只在ConvNeXt块的两个1×1卷积中间加一个GELU(上图右)。该方法将结果提升了0.7%至81.3%,与Swin-T的性能相当。

       后续改进的每个ConvNeXt块中都使用单个GELU激活。

Fewer normalization layers

       Transformer块通常也具有较少的规一化,故本文删除了原始ResNet块的两个BatchNorm(BN)层,只在conv 1×1层之前留下一个BN层(上图右)。这进一步将性能提高到81.4%,超过了Swin-T的结果。

Substituting BN with LN

       BatchNorm是ConvNets中的一个重要组件,因为其提高了收敛性并减少了过拟合。然而,BN可能会对模型的性能产生不利影响。而Transformer中使用了更简单的层归一化(LN),从而在不同的应用场景中具有良好的性能。 故本文在原始ResNet中用LN代替BN(上图右),这将性能提高至81.5%。

       后续改进将在每个残差块中使用一个LayerNorm作为规一化选择。

Separate downsampling layers

       在残差网络中,通常使用的是步长为2的3×3卷积或1×1卷积来进行下采样。而Swin Transformer将下采样层从其它运算中剥离开来,即使用一个步长为2的2×2卷积插入到不同的Stage之间。ConvNeXt也是采用了这个策略,并在下采样层前后各加入了一个LN,以及在最终的全局均值池化之后也加入了一个LN,这些归一化可以保持模型训练的稳定性。这将模型的准确率提升至82.0%,明显超越了过Swin-T的81.3%。

       基于上述一系列改进,最终得到了一个纯卷积网络的ConvNeXt系列模型。

实验

       本文构造了ConvNeXt几种不同变体ConvNeXt-T/S/B/L,其复杂性与Swin-T/S/B/L相似,以及一个更大的一个更大的ConvNeXt-XL。变体仅在每个阶段的通道数量C和块数量B上有所不同。如下配置:

  • C o n v N e X t − T : C = ( 96 , 192 , 384 , 768 ) , B = ( 3 , 3 , 9 , 3 ) ConvNeXt-T:C=(96,192,384,768),B=(3,3,9,3) ConvNeXtT:C=(96,192,384,768),B=(3,3,9,3)
  • C o n v N e X t − S : C = ( 96 , 192 , 384 , 768 ) , B = ( 3 , 3 , 27 , 3 ) ConvNeXt-S:C=(96,192,384,768),B=(3,3,27,3) ConvNeXtS:C=(96,192,384,768),B=(3,3,27,3)
  • C o n v N e X t − B : C = ( 128 , 256 , 512 , 1024 ) , B = ( 3 , 3 , 27 , 3 ) ConvNeXt-B: C = (128, 256, 512, 1024), B = (3, 3, 27, 3) ConvNeXtB:C=(128,256,512,1024),B=(3,3,27,3)
  • C o n v N e X t − L : C = ( 192 , 384 , 768 , 1536 ) , B = ( 3 , 3 , 27 , 3 ) ConvNeXt-L: C = (192, 384, 768, 1536), B = (3, 3, 27, 3) ConvNeXtL:C=(192,384,768,1536),B=(3,3,27,3)
  • C o n v N e X t − X L : C = ( 256 , 512 , 1024 , 2048 ) , B = ( 3 , 3 , 27 , 3 ) ConvNeXt-XL: C = (256, 512, 1024, 2048), B = (3, 3, 27, 3) ConvNeXtXL:C=(256,512,1024,2048),B=(3,3,27,3)

Settings

       实验报告了在ImageNet-1K训练和在ImageNet- 22K预训练并在ImageNet-1K微调两种策略,并报告了在ImageNet-1K验证集上的top-1精度。

Training on ImageNet-1K

       ImageNet-1K上ConvNeXts训练配置:使用AdamW 以 4 e − 3 4e^{-3} 4e3的学习率训练300个epoch,前20个epoch使用linear warmup,并用cosine decaying schedule,batch-size为4096,weight decay系数为0.05。数据增强采用Mixup、Cutmix、RandAugment和Random Erasing。正则化使用Stochastic Depth和Label Smoothing。还使用初始值 1 e − 6 1e^{-6} 1e6的Layer Scale,以及指数移动平均(EMA),这可以减轻了较大模型的过拟合。

Pre-training on ImageNet-22K

       ImageNet- 22K上ConvNeXts预训练配置:总共进行了90个epoch的预训练,并warmup了5个epoch,不使用EMA。其他设置遵循ImageNet-1K训练配置。

Fine-tuning on ImageNet-1K

       在ImageNet-1K上对ImageNet-22K预训练模型微调配置:使用AdamW 以 5 e − 5 5e^{-5} 5e5的学习率进行了30个epoch的微调,并采用了cosine decaying schedule,layer-wise learning rate decay,无warmup,batch-size为512,weight decay系数为 1 e − 8 1e^{-8} 1e8。默认的预训练、微调和测试分辨率是 22 4 2 224^2 2242,此外,还对ImageNet-22K和ImageNet-1K预训练模型进行了更大的分辨率为 38 4 2 384^2 3842的微调。

Results

ImageNet-1K

image
       上表(上)显示了与DeiT和Swin Transformer以及RegNets、EfficientNets 和EfficientNetsV2的比较结果。观察到,ConvNeXts在精度/计算权衡以及推理吞吐量方面与RegNet和EfficientNet相当。ConvNeXts全面优于类似计算复杂度的Swin Transformer,在没有特殊模块(如移动窗口或相对位置偏差)的情况下,ConvNeXts与Swin Transformer相比具有更高的吞吐量。

        38 4 2 384^2 3842 分辨率的ConvNeXt-B比Swin-B提高了0.6%(85.1%vs. 84.5%),但推理吞吐量提高了12.5%(95.7 vs. 85.1)。当进一步扩展到ConvNeXt-L时,观察到85.5%的改进结果。

ImageNet-22K

       上表(下)显示了从ImageNet- 22K预训练中微调的模型的结果。观察到,当用大型数据集进行预训练时,正确设计的卷积网络并不逊色于Vision Transformer,ConvNeXts的性能仍然与类似大小的Swin Transformer相当或更好,且吞吐量略高。

       此外,ConvNeXt-XL模型在 38 4 2 384^2 3842分辨率时达到了87.8%的准确率,比ConvNeXt-L有了更大的改进,表明ConvNeXts是可扩展的架构。

       在ImageNet-1K上,配备了高级模块(如Squeeze-and-Excitation)和渐进式训练程序的搜索架构(EfficientNetV2-L)取得了最佳性能。然而,通过ImageNet- 22K预训练,ConvNeXt能够超过EfficientNetV2,进一步证明了大规模训练的重要性。

Isotropic ConvNeXt vs. ViT

       本实验检查了ConvNeXt的块设计是否可泛化为vit风格的各向同性架构(没有下采样层,所有深度保持相同的特征分辨率)。故使用与ViT-S/B/L相同的特征维度(384/768/1024)构建了各向同性ConvNeXt-S/B/L,相应深度设置为18/18/36,以匹配参数和GFLOPs的数量,块结构保持不变。并使用了DeiT的ViT-S/B和MAE的ViT-L作为对比结果。ConvNeXt模型使用与之前相同的设置进行训练,但具有更长的warmup。
image
       结果如上图,观察到ConvNeXt的表现通常与ViT相当,表明ConvNeXt模块设计在非层次模型中使用时是有竞争力的。

Empirical Evaluation on Downstream Tasks

Object detection and segmentation on COCO

       本实验使用ConvNeXt作为backbone在COCO数据集上微调Mask R-CNN和Cascade Mask R-CNN。
image
       结果如上表,比较Swin Transformer、ConvNeXt和传统卷积网络(如ResNeXt)的目标检测和实例分割结果。观察到,在不同的模型复杂性中,ConvNeXt实现了与Swin Transformer相当或更好的性能。当扩展到在ImageNet-22K上预训练的更大的模型(ConvNeXt-B/L/XL)时,ConvNeXt在box和mask AP方面明显优于Swin Transformer (+1.0 AP)。

Semantic segmentation on ADE20K

image
       上表为用UperNet 在ADE20K语义分割任务上的评估结果,所有模型变体都进行了160K的epoch训练,batch-size为16,并报告了使用多尺度测试的mIoU。观察到,ConvNeXt实现有竞争力的性能,进一步验证了该架构的有效性。

Appendix

Experimental Settings

ImageNet (Pre-)training

image
       上表为ConvNeXts的ImageNet-1K训练和ImageNet-22K预训练详细设置,除了随机深度率,所有ConvNeXt变体都使用相同的设置。

       各向同性ConvNeXts同样采用上表中ImageNet-1K的设置,但warmup扩展到50个epoch,各向同性ConvNeXt-S/B禁用了layer scale,各向同性ConvNeXt-S/B/L的随机深度比为0.1/0.2/0.5。

ImageNet Fine-tuning

image
       上表列出了在ImageNet-1K数据集上进行微调的设置。除ConvNeXt-L外,微调都从预训练中获得的最终模型权重开始。ConvNeXt-L使用在预训练期间其最佳的EMA模型作为微调的起点。

Downstream Tasks

image
       对于ADE20K和COCO实验,本文遵循BEiT和Swin中使用的训练设置,还使用了MMDetection和MMSegmentation工具箱。下游任务使用了ImageNet预训练的最终模型权重(而不是EMA权重)作为网络初始化。

       对于COCO目标检测实验,超参数扫描包括学习率 { 1 e − 4 , 2 e − 4 } \{1e^{-4},2e ^{-4}\} {1e4,2e4},layer-wise learning rate decay { 0.7 , 0.8 , 0.9 , 0.95 } \{0.7, 0.8, 0.9, 0.95\} {0.7,0.8,0.9,0.95},和stochastic depth rate { 0.3 , 0.4 , 0.5 , 0.6 , 0.7 , 0.8 } \{0.3,0.4,0.5,0.6,0.7,0.8\} {0.3,0.4,0.5,0.6,0.7,0.8}。对ImageNet-22K预训练Swin-B/L也是用相同配置进行微调,并使用了官方代码和预训练的模型权重。

       对于ADE20K目标分割实验,超参数扫描包括学习率 { 8 e − 5 , 1 e − 4 } \{8e^{- 5},1e^{-4} \} {8e5,1e4}、layer-wise learning rate decay { 0.8 , 0.9 } \{0.8,0.9\} {0.8,0.9}和stochastic depth rate { 0.3 , 0.4 , 0.5 } \{0.3,0.4,0.5\} {0.3,0.4,0.5}。报告了使用多尺度测试的mIoU结果,其他单尺度测试结果见上表。

Robustness Evaluation

image
       上表为ConvNeXts和其他模型的鲁棒性评估结果。本实验在几个鲁棒性基准数据集(ImageNet-A、ImageNet-R、 ImageNet-Sketch和ImageNet-C/ ¯C数据集)上测试了ImageNet-1K训练/微调的分类模型,并报告了ImageNet-C的平均损坏误差(mCE),ImageNet- ¯C的损坏误差,以及所有其他数据集的top-1精度。

       观察到,ConvNeXts(特别是大规模模型变体)表现出很好的鲁棒性,在几个基准上超过了最先进的鲁棒Transformer模型。通过额外的ImageNet-22K数据预训练,ConvNeXt-XL展示了强大的域泛化能力(分别在ImageNet-A/R/Sketch基准上实现了69.3%/68.2%/55.0%的精度)。

Modernizing ResNets: detailed results

image
image
       上述两表为在ResNet-50/Swin-T和ResNet-200/Swin-B逐步改进到ConvNeXt-T/B的过程中,每个步骤的ImageNet-1K top-1精度和GFLOPs。ResNet-50模型使用3个随机种子进行实验。

       ResNet-200每个阶段的初始块数是(3,24,36,3),在改变阶段比例后,其各阶段块数更改为Swin-B的(3,3,27,3)。这大大减少了计算量,因此同时将其宽度从64增加到84,以保持计算量保持在一个相似的水平。在采用深度卷积的步骤之后,其宽度进一步增加到128(与Swin-B相同)。

       观察到,ResNet-200模式下的结果与ResNet-50模式下的结果基本一致。在ResNet-200中,inverting dimensions带来的改进比在ResNet-50中更大(+0.79%vs. +0.14%)。增加核大小所获得的性能在核大小为5而不是7时达到饱和。 与ResNet-50模式相比,使用更少的规一化层也有更大的增益(+0.46%vs. +0.14%)。

Detailed Architectures

image
       上表为ResNet-50、ConvNeXt-T和Swin-T之间的详细架构比较。

Benchmarking on A100 GPUs

image
       使用V100 GPU在ImageNet上进行推理吞吐量基准测试时, ConvNeXts在推理方面比具有相似参数数量的Swin Transformer略快。本节在更先进的A100 GPU上重复该基准测试。

       结果如上表。Swin Transformer和ConvNeXts都实现了比在V100 GPU上更快的推理吞吐量,但ConvNeXts的优势明显更大,有时快49%。

reference

Liu, Z. , Mao, H. , Wu, C. Y. , Feichtenhofer, C. , Darrell, T. , & Xie, S. . (2022). A convnet for the 2020s. arXiv e-prints.

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

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

相关文章

python程序设计基础:异常处理结构与程序调试、测试

第八章:异常处理结构与程序调试、测试 简单地说,异常是指程序运行时引发的错误,引发错误的原因有很多例如除零、下标越界、文件不存在、网络异常、类型错误、名字错误、字典键错误、磁盘空间不足,等等。 如果这些错误得不到正确的处理将会导致程序终止运行,而合理…

抖音视频下载工具|视频内容提取软件

引言部分: 针对抖音视频下载需求,我们团队自豪推出一款功能强大的工具,旨在解决用户获取抖音视频繁琐问题的困扰。我们通过基于C#开发的工具,让用户能够轻松通过关键词搜索实现自动批量抓取视频,并根据需求进行选择性批…

MAC地址学习和老化

MAC地址学习过程 一般情况下,MAC地址表是设备根据收到的数据帧里的源MAC地址自动学习而建立的。 图1 MAC地址学习示意图 如图1,HostA向SwitchA发送数据时,SwitchA从数据帧中解析出源MAC地址(即HostA的MAC地址)和VLAN…

PMP项目管理考试要注意些什么?

PMP考试和PMP备考过程中应该注意哪些问题? PMP备考完成后就要迎接实战考试了,考试前千万不要有多余的想法,顺其自然就行了,我想大家各种紧张、各种忧虑的原因大抵是因为考试成本考,担心考不过,其实只要你在…

excel标记文本中的关键词加红加粗

任务: 有这么一张表,关键词为 word,文本内容为 text,现在想把 text 中的 word 标红加粗,如果数据量少,文本段手动标还可以,多起来就不太方便了 代码: import pandas as pd import x…

ChatGPT助您提升求职技能

目录 ChatGPT可以作为求职技能的学习和提升平台 ChatGPT可以帮助求职者提升沟通和表达能力 ChatGPT还可以帮助求职者提升问题解决能力和创新能力 ChatGPT还可以帮助求职者建立自信心和自我推销能力 随着科技的迅速发展,人们的生活方式和工作方式也在不断地变革。…

nginx高级配置详解

目录 一、网页的状态页 1、状态页的基本配置 2、搭配验证模块使用 3、结合白名单使用 二、nginx 第三方模块 1、echo模块 1.1 编译安装echo模块 1.2 配置echo模块 三、nginx变量 1、内置变量 2、自定义变量 四、自定义图标 五、自定义访问日志 1、自定义日志格式…

安全测试:史上最全的攻防渗透信息收集方法、工具!

信息收集的意义 信息收集对于渗透测试前期来说是非常重要的。正所谓,知己知彼百战不殆,信息收集是渗透测试成功的保障,只有我们掌握了目标网站或目标主机足够多的信息之后,才能更好地进行渗透测试。 信息收集的方式可以分为两种…

虚 拟 化原理

1 概念: ①通俗理解: 虚拟化是在硬件和操作系统之间的实践 ②通过对计算机的服务层级的理解,理解虚拟化概念 抽离层级之间的依赖关系(服务器虚拟化) 2 虚拟化分类 ①按架构分类 ◆寄居架构:装在操作系统上…

JavaScript流程控制

文章目录 1. 顺序结构2. 分支结构2.1 if 语句2.2 if else 双分支语句2.3 if else if 多分支语句三元表达式 2.4 switch 语句switch 语句和 if else if语句区别 3. 循环结构3.1 for 循环断点调试 3.2 双重 for 循环3.3 while 循环3.4 do while 循环3.5 contiue break 关键字 4. …

蓝桥杯-乘积最大

原题链接:用户登录 题目描述 今年是国际数学联盟确定的“2000 --世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰 90 周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友 XZ 也有幸得以…

视频号视频下载(如何把视频号中的视频下载下来)

在如今的信息时代,热点创作者和科技创作者们的素材库越来越丰富,视频号作为一种新兴的媒体形式,其中蕴含的优质内容更是不可或缺。但是,如何将心仪的视频号视频下载下来,进行二次创作并在其他平台发布呢?今…

力扣链表篇

以下刷题思路来自代码随想录以及官方题解 文章目录 203.移除链表元素707.设计链表206.反转链表24.两两交换链表中的节点19.删除链表的倒数第N个节点面试题 02.07. 链表相交142.环形链表II 203.移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链…

【python】0、超详细介绍:json、http

文章目录 一、json二、http2.1 json 读取 request 序列化 三、基本类型3.1 decimal 四、图像4.1 颜色格式转换 一、json import json f open(data.json) # open json file data json.load(f) # 读出 json object for i in data[emp_details]: # 取出一级属性 emp_details, …

MySQL数据库基础(十五):PyMySQL使用介绍

文章目录 PyMySQL使用介绍 一、为什么要学习PyMySQL 二、安装PyMySQL模块 三、PyMySQL的使用 1、导入 pymysql 包 2、创建连接对象 3、获取游标对象 4、pymysql完成数据的查询操作 5、pymysql完成对数据的增删改 PyMySQL使用介绍 提前安装MySQL数据库(可以…

day4:对话框与事件

使用qt搭建一个简易的闹钟系统 #include "second.h" #include "ui_second.h"second::second(QWidget *parent) :QWidget(parent),ui(new Ui::second) {ui->setupUi(this);this->setWindowFlag(Qt::FramelessWindowHint);this->setAttribute(Qt::…

用C语言做一个简易Windows风格控制台终端模拟器

作品名称: 简易Windows风格控制台终端模拟器 作品介绍: 本作品是一个简易的Windows风格控制台终端模拟器,旨在模仿Windows操作系统的命令提示符(CMD)界面及其功能。程序使用C语言编写,适用于多种平台,但特别针对Windows操作系统进行了界面和用户体验的优化。 主要功能…

你真的会数据结构吗:双向链表

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载,请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主,代码兴国!❤❤❤ 各位铁汁们,大家好啊,这里是持续不断学习的大伟。不知道大家有没有开学或者是上班了呢…

Three.js 基础属性

三维坐标系 辅助观察坐标系 THREE.AxesHelper()的参数表示坐标系坐标轴线段尺寸大小,你可以根据需要改变尺寸。 // AxesHelper:辅助观察的坐标系 const axesHelper new THREE.AxesHelper(150); scene.add(axesHelper);材质半透明设置 设置材质半透明…

vant安装教程(基于vue3)

1、先安装 npm i vant 如果不行安装这个 yarn add vant 2、在main.js中引入即可 import { createApp } from vue import App from ./App.vue import router from ./router import store from ./store import { Button } from vant; import vant/lib/index.css;createApp(App).…