【第16篇】Swin Transformer(1)

image-20211009132927696

在本文中,我们寻求扩展 Transformer 的适用性,使其可以作为计算机视觉的通用主干,就像 NLP 和 CNN 在视觉中所做的那样。我们观察到,将其在语言领域的高性能转移到视觉领域的重大挑战可以通过两种模式之间的差异来解释。这些差异之一涉及规模。与作为语言转换器中处理基本元素的单词标记不同,视觉元素在规模上可能会有很大差异,这个问题在对象检测等任务中受到关注 [41, 52, 53]。在现有的基于 Transformer 的模型中 [61, 19],代币都是固定规模的,这种特性不适合这些视觉应用。另一个区别是与文本段落中的单词相比,图像中像素的分辨率要高得多。存在许多视觉任务,例如语义分割,需要在像素级别进行密集预测,这对于高分辨率图像上的 Transformer 来说是难以处理的,因为其自注意力的计算复杂度与图像大小成二次方。为了克服这些问题,我们提出了一种通用的 Transformer 主干,称为 Swin Transformer,它构建分层特征图并且对图像大小具有线性计算复杂度。如图 1(a) 所示,Swin Transformer 通过从小尺寸的补丁(灰色轮廓)开始并逐渐合并更深的 Transformer 层中的相邻补丁来构建分层表示。通过这些分层特征图,Swin Transformer 模型可以方便地利用先进的技术进行密集预测,例如特征金字塔网络 (FPN) [41] 或 U-Net [50]。线性计算复杂度是通过在划分图像的非重叠窗口中本地计算自注意力来实现的(以红色标出)。每个窗口中的补丁数量是固定的,因此复杂度与图像大小成线性关系。这些优点使 Swin Transformer 适合作为各种视觉任务的通用主干,与之前基于 Transformer 的架构 [19] 形成对比,后者产生单一分辨率的特征图并具有二次复杂性。

image-20211012150305384

Swin Transformer 的一个关键设计元素是它在连续自注意力层之间的窗口分区的移动,如图 2 所示。移动的窗口桥接前一层的窗口,提供它们之间的连接,显着增强建模能力(见表 4)。 这种策略在现实世界的延迟方面也很有效:窗口内的所有查询补丁共享相同的密钥集 1,这有助于硬件中的内存访问。 相比之下,早期的基于滑动窗口的自注意力方法 [32, 49] 由于不同查询像素的不同键集而在通用硬件上存在低延迟2。 我们的实验表明,所提出的移位窗口方法的延迟比滑动窗口方法低得多,但建模能力相似(见表 5 和表 6)。

所提出的 Swin Transformer 在图像分类、对象检测和语义分割的识别任务上取得了强大的性能。 它在三个任务上以相似的延迟显着优于 ViT / DeiT [19, 60] 和 ResNe(X)t 模型 [29, 67]。 它在 COCO 测试开发集上的 58.7 box AP 和 51.1 mask AP 以 +2.7 box AP(没有外部数据的复制粘贴 [25])和 +2.6 mask AP(DetectoRS [ 45])。 在 ADE20K 语义分割上,它在 val 集上获得了 53.5 mIoU,比之前的最先进技术(SETR [78])提高了 +3.2 mIoU。 它还在 ImageNet-1K 图像分类上实现了 86.4% 的 top-1 准确率。

我们相信,跨计算机视觉和自然语言处理的统一架构可以使这两个领域受益,因为它将促进视觉和文本信号的联合建模,并且可以更深入地共享来自两个领域的建模知识。 我们希望 Swin Transformer 在各种视觉问题上的强大表现能够在社区中更深入地推动这种信念,并鼓励视觉和语言信号的统一建模 。

2、相关工作

=================================================================

CNN 和变体 CNN 作为整个计算机视觉的标准网络模型。虽然 CNN 已经存在了几十年 [39],但直到 AlexNet [38] 的引入,CNN 才起飞并成为主流。从那时起,人们提出了更深入、更有效的卷积神经架构,以进一步推动计算机视觉领域的深度学习浪潮,例如 VGG [51]、GoogleNet [56]、ResNet [29]、DenseNet [33]、HRNet [62]和 EfficientNet [57]。除了这些架构上的进步,在改进单个卷积层方面也有很多工作,例如深度卷积 [67] 和可变形卷积 [17, 81]。 虽然 CNN 及其变体仍然是计算机视觉的主要骨干架构在应用程序中,我们强调了类似 Transformer 的架构在视觉和语言之间统一建模的强大潜力。我们的工作在几个基本的视觉识别任务上取得了强劲的表现,我们希望它有助于建模转变。

基于自注意力的骨干架构 同样受到 NLP 领域中自注意力层和 Transformer 架构成功的启发,一些作品采用自注意力层来替换流行的 ResNet [32,49,77] 中的部分或全部空间卷积层。 在这些工作中,自注意力是在每个像素的局部窗口内计算的,以加速优化 [32],并且它们实现了比对应的 ResNet 架构稍好一些的精度/FLOPs 权衡。 然而,它们昂贵的内存访问导致它们的实际延迟明显大于卷积网络 [32]。 我们建议不使用滑动窗口,而是在连续层之间移动窗口,这允许在通用硬件中更有效地实现。

自我注意/Transformer 以补充 CNN 另一项工作是使用自注意力层或 Transformer 来增强标准的 CNN 架构。 自注意力层可以通过提供编码远程依赖或异构交互的能力来补充主干 [64, 6, 68, 22,71, 54] 或头部网络 [31, 26]。 最近,Transformer 中的编码器-解码器设计已应用于对象检测和实例分割任务 [7, 12, 82, 55]。 我们的工作探索了 Transformers 对基本视觉特征提取的适应性,并且是对这些工作的补充。

基于 Transformer 的视觉主干与我们的工作最相关的是 Vision Transformer (ViT) [19] 及其后续 [60, 69, 14, 27, 63]。 ViT 的开创性工作直接将 Transformer 架构应用于不重叠的中等大小图像块上进行图像分类。与卷积网络相比,它在图像分类方面实现了令人印象深刻的速度-准确度权衡。虽然 ViT 需要大规模训练数据集(即 JFT-300M)才能表现良好,但 DeiT [60] 引入了几种训练策略,允许 ViT 使用较小的 ImageNet-1K 数据集也有效。 ViT 在图像分类上的结果令人鼓舞,但其架构不适合用作密集视觉任务或输入图像分辨率高时的通用骨干网络,因为它的低分辨率特征图和二次增加图像大小的复杂性。有一些作品通过直接上采样或反卷积将 ViT 模型应用于目标检测和语义分割的密集视觉任务,但性能相对较低 [2, 78]。与我们的工作同时进行的是一些修改 ViT 架构 [69, 14, 27] 以获得更好的图像分类。根据经验,我们发现我们的 Swin Transformer 架构可以在这些图像分类方法中实现最佳速度精度权衡,尽管我们的工作侧重于通用性能而不是专门针对分类。另一项并发工作 [63] 探索了在 Transformer 上构建多分辨率特征图的类似思路。它的复杂性仍然是图像大小的二次方,而我们的复杂性是线性的,并且也在局部操作,这已被证明有利于对视觉信号中的高相关性进行建模 [35,24,40]。我们的方法既高效又有效,在 COCO 对象检测和 ADE20K 语义分割上都达到了最先进的准确性。

3、 方法

================================================================

3.1、 整体架构


图 3 展示了 Swin Transformer 架构的概述,其中展示了微型版本 (SwinT)。 它首先通过补丁拆分模块(如 ViT)将输入的 RGB 图像拆分为不重叠的补丁。 每个补丁都被视为一个“令牌”,其特征被设置为原始像素 RGB 值的串联。 在我们的实现中,我们使用 4 × 4 的补丁大小,因此每个补丁的特征维度是 4 × 4 × 3 = 48。线性嵌入层应用于这个原始值特征以将其投影到任意维度( 表示为 C)

image-20211009160320447

在这些补丁令牌上应用了几个具有修改自注意力计算的 Transformer 块(Swin Transformer 块)。 Transformer 块保持令牌数 ( H 4 × W 4 ) \left ( \frac{H}{4}\times \frac{W}{4} \right ) (4H​×4W​),与线性嵌入一起被称为“阶段 1”。

为了产生分层表示,随着网络变得更深,通过补丁合并层来减少令牌的数量。第一个补丁合并层连接每组 2 × 2 相邻补丁的特征,并在 4C 维连接特征上应用线性层。这将令牌数量减少了 2×2 = 4 的倍数(分辨率的 2 倍下采样),并且输出维度设置为 2C。之后应用 Swin Transformer 块进行特征转换,分辨率保持在 H 8 × W 8 \frac{H}{8}\times \frac{W}{8} 8H​×8W​ 。补丁合并和特征转换的第一个块表示为“第 2 阶段”。该过程重复两次,分别为“第 3 阶段”和“第 4 阶段”,输出分辨率分别为 H 16 × W 16 \frac{H}{16}\times \frac{W}{16} 16H​×16W​ 和 H 32 × W 32 \frac{H}{32}\times \frac{W}{32} 32H​×32W​。这些阶段共同产生一个分层表示,具有与典型卷积网络相同的特征图分辨率,例如 VGG [51] 和 ResNet [29]。因此,所提出的架构可以方便地替换现有方法中用于各种视觉任务的骨干网络。

Swin Transformer 模块 Swin Transformer 是通过将 Transformer 模块中的标准多头自注意力 (MSA) 模块替换为基于移动窗口的模块(在第 3.2 节中描述)而构建的,其他层保持不变。 如图 3(b) 所示,Swin Transformer 模块由一个基于移动窗口的 MSA 模块组成,后跟一个 2 层 MLP,其间具有 GELU 非线性。 在每个 MSA 模块和每个 MLP 之前应用一个 LayerNorm (LN) 层,在每个模块之后应用一个残差连接。

3.2、基于移动窗口的自注意力


标准的 Transformer 架构 [61] 及其对图像分类的适应 [19] 都进行全局自注意力,其中计算了令牌与所有其他令牌之间的关系。 全局计算会导致与标记数量相关的二次复杂性,使其不适用于许多需要大量标记进行密集预测或表示高分辨率图像的视觉问题。

非重叠窗口中的自注意力 为了有效建模,我们建议在局部窗口内计算自注意力。 窗口被布置为以不重叠的方式均匀地划分图像。 假设每个窗口包含 M × M 个补丁,全局 MSA 模块和基于 h × w 补丁图像的窗口的计算复杂度为:

Ω ( M S A ) = 4 h w C 2 + 2 ( h w ) 2 C Ω ( W − M S A ) = 4 h w C 2 + 2 M 2 h w C \begin{aligned} &\Omega(\mathrm{MSA})=4 h w C^{2}+2(h w)^{2} C \\ &\Omega(\mathrm{W}-\mathrm{MSA})=4 h w C^{2}+2 M^{2} h w C \end{aligned} ​Ω(MSA)=4hwC2+2(hw)2CΩ(W−MSA)=4hwC2+2M2hwC​

其中前者与补丁号 hw 的二次方,当 M 固定时后者是线性的(默认设置为 7)。 全局自注意力计算对于大型hw来说通常是负担不起的,而基于窗口的自注意力是可扩展的。

连续块中的移位窗口分区 基于窗口的自注意力模块缺乏跨窗口的连接,这限制了其建模能力。 为了在保持非重叠窗口的高效计算的同时引入跨窗口连接,我们提出了一种移位窗口分区方法,该方法在连续的 Swin Transformer 块中的两个分区配置之间交替。

如图 2 所示,第一个模块使用从左上角像素开始的常规窗口划分策略,将 8 × 8 特征图均匀划分为大小为 4 × 4 (M = 4) 的 2 × 2 窗口。 然后,下一个模块采用从前一层的窗口配置偏移的窗口配置,通过将窗口从规则分区的窗口中移动 ( ⌊ M 2 ⌋ , ⌊ M 2 ⌋ ) \left ( \left \lfloor \frac{M}{2} \right \rfloor, \left \lfloor \frac{M}{2} \right \rfloor \right ) (⌊2M​⌋,⌊2M​⌋)个像素。 使用移位窗口分区方法,连续的 Swin Transformer 块计算为

z ^ l = W − M S A ( L N ( z l − 1 ) ) + z l − 1 z l = MLP ⁡ ( L N ( z ^ l ) ) + z ^ l z ^ l + 1 = S W − M S A ( L N ( z l ) ) + z l z l + 1 = M L P ( L N ( z ^ l + 1 ) ) + z ^ l + 1 \begin{aligned} &\hat{\mathbf{z}}{l}=\mathrm{W}-\mathrm{MSA}\left(\mathrm{LN}\left(\mathbf{z}{l-1}\right)\right)+\mathbf{z}^{l-1} \\ &\mathbf{z}{l}=\operatorname{MLP}\left(\mathrm{LN}\left(\hat{\mathbf{z}}{l}\right)\right)+\hat{\mathbf{z}}^{l} \\ &\hat{\mathbf{z}}{l+1}=\mathrm{SW}-\mathrm{MSA}\left(\mathrm{LN}\left(\mathbf{z}{l}\right)\right)+\mathbf{z}^{l} \\ &\mathbf{z}{l+1}=\mathrm{MLP}\left(\mathrm{LN}\left(\hat{\mathbf{z}}{l+1}\right)\right)+\hat{\mathbf{z}}^{l+1} \end{aligned} ​zl=W−MSA(LN(zl−1))+zl−1zl=MLP(LN(zl))+zlzl+1=SW−MSA(LN(zl))+zlzl+1=MLP(LN(zl+1))+zl+1​

其中 z ^ l \hat{\mathbf{z}}^{l} z^l和 z l \mathbf{z}^{l} zl 分别表示块 l l l 的 (S)WMSA 模块和 MLP 模块的输出特征; W-MSA 和 SW-MSA 分别表示使用常规和移位窗口分区配置的基于窗口的多头自注意力。

移位窗口分区方法在前一层中引入了相邻非重叠窗口之间的连接,并被发现在图像分类、对象检测和语义分割中是有效的,如表 4 所示。

image-20211012150419107

移位配置的高效批量计算 移位窗口分区的一个问题是它会导致更多窗口,在移位配置中从 ⌈ h M ⌉ × ⌈ w M ⌉ \left \lceil \frac{h}{M} \right \rceil \times \left \lceil \frac{w}{M} \right \rceil ⌈Mh​⌉×⌈Mw​⌉ 到 ( ⌈ h M ⌉ + 1 ) × ( ⌈ w M ⌉ + 1 ) \left ( \left \lceil \frac{h}{M} \right \rceil +1 \right ) \times \left ( \left \lceil \frac{w}{M} \right \rceil+1 \right ) (⌈Mh​⌉+1)×(⌈Mw​⌉+1),并且一些窗口将小于 M × M。一个简单的解决方案是将较小的窗口填充到 M × M 的大小,并在计算注意力时屏蔽填充的值。当常规分区中的窗口数量很少时,例如 2 × 2,这个简单的解决方案增加的计算量是相当可观的(2 × 2 !3 × 3,是 2.25 倍)。在这里,我们提出了一种更有效的批量计算方法,通过向左上方向循环移位,如图 4 所示。 在这种移位之后,一个批量窗口可能由几个在特征图中不相邻的子窗口组成,因此采用屏蔽机制将自注意力计算限制在每个子窗口内。使用循环移位,批处理窗口的数量与常规窗口分区的数量相同,因此也是有效的。这种方法的低延迟如表 5 所示。

相对位置偏差 在计算自注意力时,我们遵循 [48, 1, 31, 32] 通过在计算相似度时将相对位置偏差 B ∈ R M 2 × M 2 B\in \mathbb{R}{M{2}\times M^{2}} B∈RM2×M2添加到每个头部:

Attention ⁡ ( Q , K , V ) = S o f t Max ⁡ ⁡ ( Q K T / d + B ) V \operatorname{Attention}(Q, K, V)=\operatorname{Soft\operatorname{Max}}\left(Q K^{T} / \sqrt{d}+B\right) V Attention(Q,K,V)=SoftMax(QKT/d ​+B)V

其中 Q , K , V ∈ R M 2 × d Q, K, V \in \mathbb{R}{M{2} \times d} Q,K,V∈RM2×d是查询、键和值矩阵; d 是查询/键维度,M2 是窗口中的补丁数。 由于沿每个轴的相对位置位于 [−M + 1; M − 1],我们参数化一个更小的偏置矩阵 B ^ ∈ R ( 2 M − 1 ) × ( 2 M − 1 ) \hat{B} \in \mathbb{R}^{(2 M-1) \times(2 M-1)} B^∈R(2M−1)×(2M−1),B 中的值取自 B ^ \hat{B} B^

我们观察到与没有这个偏置项或使用绝对位置嵌入的对应项相比有显着的改进,如表 4 所示。在 [19] 中进一步向输入添加绝对位置嵌入会略微降低性能,因此在我们的实现中没有采用。

预训练中学习到的相对位置偏差也可用于初始化模型,通过双三次插值 [19, 60] 使用不同的窗口大小进行微调。

3.3、架构变体


我们建立我们的基础模型,称为 Swin-B,具有 模型大小和计算复杂度类似于 ViTB/DeiT-B。 我们还介绍了 Swin-T、Swin-S 和 Swin-L,它们分别是模型大小和计算复杂度约为 0.25x、0.5x 和 2x 的版本。 请注意,Swin-T 和 Swin-S 的复杂度分别与 ResNet-50 (DeiT-S) 和 ResNet-101 的复杂度相似。 默认情况下,窗口大小设置为 M = 7。 对于所有实验,每个头部的查询维度为 d = 32,每个 MLP 的扩展层为 α = 4。 这些模型变体的架构超参数是:

  • Swin-T: C = 96 C=96 C=96, layer numbers = { 2 , 2 , 6 , 2 } =\{2,2,6,2\} ={2,2,6,2}

  • Swin-S: C = 96 C=96 C=96, layer numbers = { 2 , 2 , 18 , 2 } =\{2,2,18,2\} ={2,2,18,2}

  • Swin-B: C = 128 C=128 C=128, layer numbers = { 2 , 2 , 18 , 2 } =\{2,2,18,2\} ={2,2,18,2}

  • Swin-L: C = 192 C=192 C=192, layer numbers = { 2 , 2 , 18 , 2 } =\{2,2,18,2\} ={2,2,18,2}

其中 C 是第一阶段隐藏层的通道数。 表 1 列出了 ImageNet 图像分类模型变体的模型大小、理论计算复杂度 (FLOPs) 和吞吐量。

4、实验

===============================================================

我们对 ImageNet-1K 图像分类 [18]、COCO 对象检测 [42] 和 ADE20K 语义分割 [80] 进行了实验。 在下文中,我们首先将所提出的 Swin Transformer 架构与之前在三个任务上的最新技术进行比较。 然后,我们在 Swin Transformer 的重要设计元素做了消融实验。

4.1. ImageNet-1K 上的图像分类


设置 对于图像分类,我们在 ImageNet-1K [18] 上对提议的 Swin Transformer 进行了基准测试,其中包含来自 1,000 个类别的 1.28M 训练图像和 50K 验证图像。 报告了单个作物的 top-1 准确度。 我们考虑两种训练设置:

  • 常规 ImageNet-1K 训练。 此设置主要遵循 [60]。 我们使用一个 AdamW [36] 优化器,使用余弦衰减学习率调度器和 20 个 epochs 的线性热身进行 300 个 epochs。 使用 1024 的批大小、0.001 的初始学习率和 0.05 的权重衰减。 我们在训练中包含了 [60] 的大部分增强和正则化策略,除了重复增强 [30] 和 EMA [44],它们不会提高性能。 请注意,这与[60]相反,其中重复增强对于稳定 ViT 的训练至关重要。

  • 在 ImageNet-22K 上进行预训练并在 ImageNet-1K 上进行微调。 我们还在更大的 ImageNet-22K 数据集上进行了预训练,该数据集包含 1420 万张图像和 22K 类。 我们使用带有 5 个时期线性热身的线性衰减学习率调度器对 60 个时期使用 AdamW 优化器。 批量大小为 4096,初始学习率为 0.001,权重衰减为 0.01。 在 ImageNet-1K 微调中,我们以 1024 的批大小、10-5 的恒定学习率和 1 0 − 8 10^{-8} 10−8 的权重衰减训练模型 30 个时期。

image-20211012150108056

常规 ImageNet-1K 训练的结果 表 1(a) 展示了使用常规 ImageNet-1K 训练与其他主干的比较,包括基于 Transformer 和基于 ConvNet 的主干。

与之前最先进的基于 Transformer 的架构(即 DeiT [60])相比,Swin Transformers 明显优于具有相似复杂性的对应 DeiT 架构:Swin-T (81.3%) 比 DeiT-S (79.8%) + 1.5% ) 使用 2242 输入,Swin-B (83.3%/84.2%) 使用 22 4 2 / 38 4 2 224{2}/384{2} 2242/3842 输入,分别超过 DeiT-B (81.8%/83.1%) +1.5%/1.1%。

与最先进的 ConvNets,即 RegNet [47] 和 EfficientNet [57] 相比,Swin Transformer 实现了稍微更好的速度-精度权衡。 请注意,虽然 RegNet [47] 和 EfficientNet [57] 是通过彻底的架构搜索获得的,但所提出的 Swin Transformer 改编自标准 Transformer,并且具有进一步改进的强大潜力。

ImageNet-22K 预训练的结果 我们还在 ImageNet-22K 上预训练了更大容量的 Swin-B 和 Swin-L。 在 ImageNet-1K 图像分类上微调的结果如表 1(b) 所示。 对于 Swin-B,ImageNet-22K 预训练比从头开始训练 ImageNet-1K 带来了 1.8%∼1.9% 的收益。 与之前 ImageNet-22K 预训练的最佳结果相比,我们的模型在速度和准确度之间取得了明显更好的权衡:Swin-B 获得了 86.0% 的 top-1 准确度,比具有相似推理吞吐量的 ViT 高 2.0% (84.7 对 85.9 张图像/秒)和略低的 FLOP(47.0G 对 55.4G)。 较大的 Swin-L 模型实现了 86.4% 的 top-1 准确率,略好于 Swin-B 模型。

4.2. COCO 上的物体检测


设置 对象检测和实例分割实验在 COCO 2017 上进行,其中包含 118K 训练、5K 验证和 20K 测试开发图像。使用验证集进行消融研究,并在 test-dev 上报告系统级比较。对于消融研究,我们考虑了四种典型的对象检测框架:级联掩码 R-CNN [28, 5]、ATSS [76]、RepPoints v2 [11] 和 mmdetection [9] 中的稀疏 RCNN [55]。对于这四个框架,我们使用相同的设置:多尺度训练 [7, 55](调整输入的大小,使短边在 480 到 800 之间,而长边最多为 1333)、AdamW [43] 优化器(初始学习率为 0.0001,权重衰减为 0.05,批量大小为 16),以及 3x 计划(36 个时期)。对于系统级比较,我们采用改进的 HTC [8](表示为 HTC++)和 instaboost [21]、更强的多尺度训练 [6]、6x 计划(72 epochs)、soft-NMS [4] 和 ImageNet -22K 预训练模型作为初始化。

我们将 Swin Transformer 与标准 ConvNets(即 ResNe(X)t)和之前的 Transformer 网络(例如 迪特。 比较是通过在其他设置不变的情况下仅更改主干来进行的。 请注意,虽然 Swin Transformer 和 ResNe(X)t 由于其分层特征图可直接适用于上述所有框架,但 DeiT 仅生成单一分辨率的特征图,不能直接应用。 为了公平比较,我们按照 [78] 使用反卷积层为 DeiT 构建分层特征图。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)

.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)

img
  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值