ViT 论文逐段精读——B站up:跟李沐学AI讲解笔记

news2024/11/26 7:48:41

https://www.bilibili.com/video/BV15P4y137jb

Vision Transformer 挑战了 CNN 在 CV 中绝对的统治地位。Vision Transformer 得出的结论是如果在足够多的数据上做预训练,在不依赖 CNN 的基础上,直接用自然语言上的 Transformer 也能 CV 问题解决得很好。Transformer 打破了 CV、NLP 之间的壁垒。

先理解题目:An image is worth 16 ∗ 16 16*16 1616 words: Transformers for Image Recognition at scale。题目中的 16 ∗ 16 16*16 1616 words 含义是把一张图片看作由很多 16 ∗ 16 16*16 1616 大小 patch 组成的整体。

Abstract

之前的注意力只是作为一个小模块替换 CNN 的某一部分。Vision Transformer 则是直接作用于图像块,而且效果也很好。尤其是当在大规模数据集做预训练,迁移到中小型数据使用,Vision Transformer 能达到跟最好的 CNN 相媲美的效果,而且使用的计算资源更少(但是对普通人来说,也很难获得)。

Introduction

Self-attention-based architecture,特别是 Transformer,成为 NLP 的首选模型。主要的方法是在大型文本语料库上进行预训练,然后在较小的特定任务数据集上进行微调(Bert 这篇文章提出的)。由于 Transformer 的计算效率和可扩展性,它可以训练前所未有的规模的模型,具有超过 100B 个参数。随着模型和数据集的增长,仍然没有出现性能饱和的迹象。(第一段)

在 CV 中,卷积架构仍然占主导地位。Transformer 难以应用在 CV 中,主要是因为图片对应的序列太长。如果 Transformer 用在 CV 上,那么要采取办法降低输入序列的长度,。受 NLP 成功的启发,许多论文尝试在 CV 中应用 self-attention:①、将类 CNN 的架构与 self-attention 结合(文章 Wang et al., 2018 使用网络中间的特征图作为 Transformer 的序列输入,而不是直接使用像素点);②、完全取代卷积,全部使用 self-attention (Ramachandran等人,2019;Wang et al ., 2020a)(第一篇文章使用局部窗口。通过控制窗口的大小,限制计算复杂度。第二篇文章是在 h 与 w 两个维度分别做两次 self-attention)。后一种模型虽然在理论上是有效的,但由于使用了专门的注意力模式,还没有在现代硬件加速器上有效地扩展。因此,在大规模图像识别中,经典的类 Resnet 架构仍然是最先进的(Mahajan等人,2018;谢等,2020;科列斯尼科夫等人,2020)。(第二段)

受 Transformer 在 NLP 的可扩展性的启发,将一个标准的 Transformer 直接应用于图像,且做很少的修改(不针对视觉任务做特定的改变)。此时,必须重新考虑前文的问题:Transformer 如何应对从图像转换来的如此长的序列。ViT 的处理: 先把一个 224 ∗ 224 224*224 224224 的图片打成很多个 16 ∗ 16 16*16 1616 的 patch。原先的序列长度是 50176 ( 224 ∗ 224 ) 50176(224*224) 50176224224;现在的“宽”“高”是 14 ∗ 14 ( 224 / 16 ) 14*14(224/16) 1414224/16,现在的序列长度是 196 ( 14 ∗ 14 ) 196(14*14) 1961414。然后,把每个 patch 当作一个元素,通过一个 fc layer 得到一个 linear embedding。最后,这些作为输入传给 Transformer。这些 image patch 可以看作是 NLP 中的单词 ———— 一个句子有多少个单词;一张图像有多少个 patch。基于有监督的图片分类训练这个模型。为何突出 有监督 的呢?因为 Transformer 都是用无监督的方式训练的,要么用 language modeling,要么用 mask language modeling。对于 CV,大部分的工作还是有监督的训练方式。(第三段)

ViT 把 CV 任务当作 NLP 任务处理去做,尤其中间的这个模型就是用一个 Transformer encoder,跟 Bert 是完全一样的。这篇论文告诉我们用 Transformer 处理 CV 任务也能达到很棒的效果。

如果不加比较强的约束,ViT 在中型数据集(如:ImageNet)训练的效果,跟同等大小的残差网络相比,要弱几个点。这个看起来不太好的结果是可预期的:Transformer 缺少卷积网络具有的 inductive biases(归纳偏置)。卷积网络具有先验信息,可以用较少的数据学习一个比较好的模型。Transformer 没有先验信息。它所有对现实世界的感知都需要从数据里自己学习。(第四段)

inductive biases 可以看作一种先验知识,或者提前做好的假设。卷积网络的两个常见的 inductive biases:①、locality —— 卷积网络以滑动窗口的形式在图片上一点一点地进行卷积。因此,假设图片相邻的区域有相邻的特征。②、translation equivariance —— 不论是先卷积再平移,还是先平移再卷积,得到的结果都是一样的。卷积网络的卷积核相当于一个 template(模板),不论图片中同样的物体移到哪里,同样的输入遇到同样的卷积核,那么输出应该永远是一样的。

在第五段,作者用在更大的数据集预训练,迁移到小数据集,在小数据集上获得近似或者比顶级卷积网络更好的结果。(18:16 —— 19:19)

Introduction 的总结 19:19 —— 20:25

Conclusion

20:30 —— 24:34

Transformer 在图像识别中的直接应用。与之前在计算机视觉中使用自注意的工作不同,除了初始 patch 提取步骤外,我们没有将特定于图像的归纳偏差引入体系结构。相反,我们将图像解释为一系列 patch,并通过 NLP 中使用的标准 Transformer 编码器对其进行处理。当与大型数据集的预训练相结合时,这种简单但可扩展的策略效果出奇地好。因此,Vision Transformer 在许多图像分类数据集上达到或超过了最先进的水平,同时预训练相对便宜。(第一段)

虽然这些初步结果令人鼓舞,但仍存在许多挑战。一是将 ViT 应用于其他计算机视觉任务,如检测和分割。我们的结果,加上 Carion 等人(2020)的结果,表明了这种方法的前景。另一个挑战是继续探索自我监督的预训练方法。我们的初步实验显示了自监督预训练的改进,但自监督预训练与大规模监督预训练之间仍有很大差距。最后,进一步扩展 ViT可能会提高性能。(第二段)

Related Work

Transformer 是由 Vaswani 等人(2017)提出的用于机器翻译的方法,并且已经成为许多 NLP 任务中最先进的方法。基于大型 Transformer 的模型通常在大型语料库上进行预训练,然后针对具体任务进行微调:BERT (Devlin等人,2019)使用去噪自监督预训练任务(“完形填空”);而 GPT 的工作线使用语言建模(预测下一个单词)作为其预训练任务(Radford等人,2018;2019;Brown et al., 2020)。(第一段)

应用在图像领域的 self-attention 要求每个像素都关注其他像素。由于像素数量的代价是二次的( n 2 n^2 n2),因此不能按实际的输入大小进行缩放。直接在像素层面使用 Transformer 是不现实的。因此,为了在图像领域应用 Transformer,过去已经尝试了几种近似方法。Parmar等人(2018)仅在局部邻域对每个查询像素应用自关注,而不是全局。这种局部多头点积自注意块可以完全取代卷积(Hu et al., 2019;Ramachandran等人,2019;赵等,2020)。在不同的工作中,稀疏变形器(Child等人,2019)采用可扩展的全局自关注近似,以便适用于图像。另一种扩展注意力的方法是将其应用于不同大小的块(Weissenborn等人,2019),在极端情况下,仅沿着单个轴(Ho等人,2019;Wang et al., 2020a)。许多这些专门的注意力架构在计算机视觉任务上显示出有希望的结果,但需要复杂的工程才能在硬件加速器上有效地实现。(第二段)

与我们最相关的是 Cordonnier 等人(2020)的模型,该模型从输入图像中提取大小为 2 × 2 2 × 2 2×2 的斑块,并在其上应用完全的自关注。这个模型与 ViT 非常相似,但我们的工作进一步证明了大规模的预训练使 Transformer 可与最先进的 CNN 竞争(效果甚至更好)。此外,Cordonnier et al.(2020)使用了 2 × 2 2 × 2 2×2 像素的小补丁尺寸,这使得该模型仅适用于小分辨率图像,而我们也可以处理中分辨率图像。(第三段)

可以说,ViT 是第三段的这篇文章的 “后续之作”。ViT 采纳了它的研究方法,并将之应用在更大的数据集。

第四段介绍 CNN 与 self-attention 相结合的研究工作。

另一个最近的相关模型是 image GPT(iGPT)(Chen et al ., 2020a),该模型在降低图像分辨率和色彩空间后,将 Transformer应用于图像像素。该模型以无监督的方式作为生成模型进行训练,然后可以对结果表示进行微调或线性探测以获得分类性能,在ImageNet上实现72%的最大准确率。(第五段)

iGPT 是一个生成式模型。CV 中的大多数模型是判别式的。

有些论文探索了比标准 ImageNet 数据集更大规模的图像识别。使用额外的数据集可以在标准基准上获得最先进的结果(Mahajan等人,2018;Touvron等人,2019;谢等,2020)。此外,Sun等人(2017)研究了 CNN 性能如何随数据集大小而扩展,Kolesnikov等人(2020);Djolonga等人(2020) 在 ImageNet-21k 和 JFT-300M 等大规模数据集上对 CNN 迁移学习进行了实证探索。我们也关注后两个数据集,但是训练 Transformer 而不是在之前的作品中使用的基于 Resnet 的模型。(第六段)

Method(ViT)

在模型设计中,我们尽可能地遵循原始 Transformer (Vaswani et al ., 2017)。这样是为了高效的利用 NLP 领域的 Transformer 的优点。

Vision Transformer(ViT)



请添加图片描述

(时间段 30:45-38:20 讲解 Fig.1。Fig.1 是 ViT 的整体架构图)

Fig 1 把左下角给定的这张图打成 9 宫格,然后把这 9 个 patch 转换为一个序列。每个 patch 通过 Linear Projection 得到一个特征,即论文中提到的 “patch embedding”。self-attention 是所有元素之间两两交互计算,不存在先后次序问题。但是对于左下角的图来说,由九宫格而来的序列是有序的;如果顺序颠倒,图片也不再是原有的图片。NLP 保持序列的顺序的方法是为 patch embedding 加上 position embedding。同样地,ViT 也为由九宫格而来的序列的 9 个元素添加了 position embedding。此时,这 9 个 token 也就具有图像块的图像信息和位置信息。接下来的操作与 NLP 完全一样:把 token 交给 Transformer encoder 计算,从而得到相应的输出。

问题是有 9 个输出,使用哪个输出用于图像分类呢?ViT 借鉴 BERT 的 extra learnable embedding(cls token),即 Fig 1 中序列最左端的 “0”。因为所有的 token 彼此间都有在交互(self-attention 计算),所以可以相信 “0号embedding” 能够从其他 embedding 里学到有用的信息,从而根据 “0号embedding” 做图像分类判断即可。Fig 1 中的 “MLP Head” 是一个通用的分类头。最后,用交叉熵函数进行模型训练。

Fig 1 的右侧给出了 Transformer encoder 的结构。它的流程简单,多次叠加后,成为 ViT 的主体。


用具体的数字把 Fig 1 的流程走一遍:

图片 x x x 大小为: 224 ∗ 224 ∗ 3 224*224*3 2242243;每个 patch 的大小为 16 ∗ 16 16*16 1616;可知共有 22 4 2 1 6 2 = 196 \frac{224^2}{16^2}=196 1622242=196 个patch(图像块);每个图像块的维度为 16 ∗ 16 ∗ 3 = 768 16*16*3=768 16163=768。故 x  的大小变化为 : 224 ∗ 224 ∗ 3 → 196 ∗ 768 x\ 的大小变化为:224*224*3 \rightarrow 196*768 x 的大小变化为:2242243196768

Linear Projection 是一个全连接层,文章中用 E E E 表示, E E E 的大小为 768 ∗ 768 768*768 768768(第一个 768 表示每个图像块的大小;第二个 768 是可以变化的,文章用 D D D 表示,如果图片变大, D D D 也可以变大)。

patch 通过 Linear Projection 的计算是矩阵计算: X ( 196 , 767 ) ∗ E ( 768 , 768 ) = R e s u l t ( 196 , 768 ) X_{(196,767)}*E_{(768,768)}=Result_{(196,768)} X(196,767)E(768,768)=Result(196,768)。结果含义是有 196 个 token,每个 token 向量维度是 768。再为每个 token 加上原图像块的 position embedding。最后加上一个 cls token,便得到了最终进入 Transformer 的序列;它的大小是 197 ∗ 768 197*768 197768

(Fig 1 右侧流程)
Transformer 的输入 embedded patches 就是一个大小为 197 ∗ 768 197*768 197768 T e n s o r Tensor Tensor

T e n s o r Tensor Tensor 进行 L a y e r N o r m Layer Norm LayerNorm 处理。

进行 M u l t i − H e a d   a t t e n t i o n Multi-Head\ attention MultiHead attention 计算。 H e a d Head Head 12 12 12。每个 H e a d Head Head K , Q , V \pmb{K},\pmb{Q},\pmb{V} K,Q,V 维度为 197 ∗ 64 197*64 19764 64 = 768 12 64=\frac{768}{12} 64=12768)。最后把所有 H e a d Head Head 的输出拼接(concatenate), M u l t i − H e a d   a t t e n t i o n Multi-Head\ attention MultiHead attention 的最终结果维度还是 197 ∗ 768 197*768 197768

进行 L a y e r N o r m Layer Norm LayerNorm 处理。

进行 MLP 处理。MLP 先把维度放大四倍,再投射为原大小( 197 ∗ 3072 → 197 ∗ 768 197*3072 \rightarrow 197*768 1973072197768),最后输出。



标准的 Transformer 需要一系列 1D 的 token 作为输入。对 2D 的 image 处理是把图片 X ∈ R H ∗ W ∗ C \pmb{X}\in\pmb{R}^{H*W*C} XRHWC 打成多个小 patch X p ∈ R N ∗ ( P 2 ⋅ C ) \pmb{X}_p\in\pmb{R}^{N*(P^2·C)} XpRN(P2C)。C 是 channel 数,(P,P) 表示每个图像块, N = H W P 2 N=\frac{HW}{P^2} N=P2HW 是 patch 总数。Transformer 使用 D D D 作为向量长度。因此,用一个可训练的线性层(linear projection)把每个 patch 拉伸为 D 维。这个输出作为 patch embedding。(第一段)

为了最后的分类,借鉴 BERT 的 class token(cls token)。它是一个可学习的特征,维度也是 D。经过很多层的 Transformer Encoder 后,把 cls token 作为 ViT 的输出,也就是整个图像的特征。最后,加个 MLP 的分类头用于图像分类即可。(第二段)

ViT 使用标准的可学习的 1D position embedding(也就是 BERT 里的位置编码)。作者也用了 2D-aware position embedding。发现二者的效果差不多。(第三段)(在附录里有更详细的消融实验)

z 0 = [ x c l a s s ;   x p 1 E ;   x p 2 E ;   . . . ;   x p N E ]   +   E p o s s , E ∈ R ( P 2 ⋅ C ) ∗ D , E p o s s ∈ R ( N + 1 ) ∗ D (公式一) \pmb{z}_0 = [x_{class};\ x^1_p\pmb{E};\ x^2_p\pmb{E};\ ...;\ x^N_p\pmb{E}]\ +\ \pmb{E}_{poss},\pmb{E}\in\pmb{R}^{(P^2·C)*D},\pmb{E}_{poss}\in\pmb{R}^{(N+1)*D} (公式一) z0=[xclass; xp1E; xp2E; ...; xpNE] + EpossER(P2C)DEpossR(N+1)D(公式一)
z l ′ = M S A ( L N ( z l − 1 ) )   +   z l − 1 , l = 1... L (公式二) z'_l = MSA(LN(z_{l-1}))\ + \ z_{l-1},l=1...L(公式二) zl=MSA(LN(zl1)) + zl1l=1...L(公式二)
z l = M L P ( L N ( z l ′ ) )   +   z l ′ , l = 1... L (公式三) z_l = MLP(LN(z'_{l}))\ + \ z'_{l},l=1...L(公式三) zl=MLP(LN(zl)) + zll=1...L(公式三)
y = L N ( z L 0 ) (公式四) \pmb{y}=LN(\pmb{z}^0_L)(公式四) y=LN(zL0)(公式四)

以上是对 ViT 的文字描述。下面的 Inductive bias、Hybrid Architecture 是作者对 ViT 的补充分析。

Inductive bias。 我们注意到 Vision Transformer 比 CNN 具有更少的图像特定的感应偏置。在 CNN 中,locality、two-dimensional neighborhood structure、translation equivariance 等被嵌入到整个模型的每一层中。在 ViT 中,只有 MLP 层是 locality、translation equivariance 的,而 self-attention layer 是全局的。two-dimensional neighborhood structure 的使用非常少:在模型开始时通过将图像切割成小块,以及在微调时用于调整不同分辨率图像的位置嵌入(如下所述)。除此之外,初始化时的位置嵌入不携带关于 patch 的二维位置信息,所有 patch 之间的空间关系都需要从头学习。

Hybrid Architecture. 作为原始图像补丁的替代方案,输入序列可以由 CNN 的特征映射形成(LeCun et al, 1989)。在该混合模型中,将 patch embedding 投影 E \pmb{E} E(Eq. 1)应用于从 CNN feature map 中提取的 patch。作为一种特殊情况,patch 的空间大小可以是 1x1,这意味着输入序列是通过简单地将 feature map 的空间维度平坦化并投影到 Transformer 维度来获得的。如上所述添加分类输入嵌入和位置嵌入。

Fine-tuning And Higher Resolution

通常,我们在大型数据集上预训练 ViT,并对(较小的)下游任务进行微调。为此,我们移除预训练的预测头,并附加一个零初始化的 D × K \pmb{D} × \pmb{K} D×K 前传层,其中 K \pmb{K} K 是下游类的数量。与预训练相比,在更高分辨率下进行微调通常是有益的(Touvron等人,2019;Kolesnikov et al, 2020)。当输入更高分辨率的图像时,我们保持 patch 大小不变,从而获得更大的有效序列长度。Vision Transformer 可以处理任意序列长度(直到内存限制),但是,预训练的位置嵌入可能不再有意义。因此,我们根据预训练的位置嵌入在原始图像中的位置对其进行二维插值。请注意,此分辨率调整和补丁提取是将图像的2D结构的感应偏置手动注入 Vision Transformer 的唯一点。

Experiments

(52:18 – 1:09:53)

我们评估了 ResNet、Vision Transformer (ViT) 和 hybrid 的表示学习能力。为了了解每个模型的数据需求,我们在不同大小的数据集上进行预训练,并评估许多基准任务。当考虑到预训练模型的计算成本时,ViT 表现非常好,以较低的预训练成本在大多数识别基准上达到最先进的水平。最后,我们使用 self-supervison 进行了一个小实验,并表明 self-supervision 的 ViT 在未来是有希望的。

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

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

相关文章

PotPlayer结合alist播放网盘视频

目录 1. PotPlayer的下载安装2. 新建专辑3. 测试播放视频总结 欢迎关注 『发现你走远了』 博客,持续更新中 欢迎关注 『发现你走远了』 博客,持续更新中 书接上文 AList挂载工具安装搭建使用教程,快速访问多个网盘的资源(保姆级图…

12-git-pycharm配置.ignore文件

pycharm配置.ignore文件 前言安装插件使用添加其他忽略文件 前言 在开发中经常需要配置提交git的忽略文件,本篇来学习下使用pycharm自动生成.ignore文件 安装插件 Files->setting->Plugins,搜索ignore 使用 右键项目根目录,新建.…

AI大模型私有化部署流程

私有化部署AI大模型需要一定的GPU支持,适合有一定经济实力的公司,今天和大家分享一下如何进行私有化部署,这涉及很专业的知识,包括硬件和软件环境、模型部署、API集成、测试验证等,这里只是初步讨论一下,希…

chatgpt赋能python:Python分词:从原理到实践

Python分词:从原理到实践 分词是自然语言处理中的关键步骤之一,它是指将一句话或一段文本分成若干个词语(token)并进行标注。Python作为一种非常流行的编程语言,具备强大的文本处理能力,而分词也是它的强项…

chatgpt赋能python:Python函数调用函数

Python函数调用函数 Python中的函数是一组可重用的代码,用于执行特定的任务。当我们需要在一个程序中执行类似的操作多次时,就可以定义一个函数来完成该操作,这样可以减少重复代码,使程序更加易读、易维护。 在Python中&#xf…

OpenCV实战——提取视频中的前景对象

OpenCV实战——提取视频中的前景对象 0. 前言1. 提取视频中的前景对象2. 混合高斯方法3. 完整代码相关链接 0. 前言 当固定摄像机观察场景时,背景基本保持不变。在这种情况下,我们真正感兴趣的目标是场景中的移动物体。为了提取这些前景物体&#xff0c…

关系数据模型

1.键的概念 超键:在一个关系中,能唯一标识元组的属性或属性集(可能存在多余的属性) 侯选建:如果一个属性集能唯一标识元组(超键),且又不含有多余的属性,那么这个属性集…

C#,码海拾贝(40)——求解“线性最小二乘问题”的“豪斯荷尔德Householder变换法”之C#源代码

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> /…

6月9日复盘总结|8H30min|7:30-7:50

7:20-8:10 乐词*93 【50min】 8:20-9:20 背书 【1h】 9:20-10:20 词汇笔记 【1h】 10:20-11:00 词汇笔记 【50min】 11:00-12:10 去上马吃饭啦 12:20-13:00 不背单词 【40min】 13:00-13:30 收作业 13:30-14:30 午休♨️ 14:40-15:59 不背单词 *1…

node.js的http模块

http模块 http协议:超文本传输协议&#xff08;互联网应用最广泛的协议之一&#xff09; http请求方法&#xff1a; get获取数据 post新增数据 put/patch更新数据 delete删除数据 head/options/connect/trace URL统一资源定位符&#xff0c;其本身也是一个字符串。 客户端与…

chatgpt赋能python:Python运算简介:从基础运算到高级应用

Python运算简介&#xff1a;从基础运算到高级应用 Python是一种优秀的编程语言&#xff0c;它能够进行各种运算&#xff0c;从简单的加减乘除到高级的科学计算和模拟。在这篇文章中&#xff0c;我们将介绍Python的各种运算方式&#xff0c;并向您展示如何使用它们来进行一些最…

chatgpt赋能python:Python怎么免费用的?

Python 怎么免费用的&#xff1f; Python 是一种高级编程语言&#xff0c;自带简洁优美的语法和强大的开发库。因此&#xff0c;它成为了各种应用程序、网站和服务的主要编程语言之一。如果你对编程语言有些了解&#xff0c;那么你应该知道 Python 很适合开发各类工具、脚本和…

SpringBoot整合MongDB

文章目录 1. MongoDB概述2. MongoDB安装3. MongoDB快速入门3.1 数据库以及表的操作3.2 新增数据3.3 更新数据3.4 删除数据3.5 查询数据3.6 索引3.7 执行计划 4、SpringBoot整合MongoDB4.1 环境搭建4.2 新增文档4.3 查询文档4.4 更新文档4.5 删除文档 人生哪能多如意&#xff0c…

黑马Redis视频教程高级篇(安装Canal)

目录 1、开启MySQL主从 1.1、开启binlog 1.2、设置用户权限 2、安装Canal 2.1、创建网络 2.3、安装Canal 1、开启MySQL主从 Canal是基于MySQL的主从同步功能&#xff0c;因此必须先开启MySQL的主从功能才可以。 这里以之前用Docker运行的mysql为例&#xff1a; 1.1、开…

chatgpt赋能python:如何将Python切换成中文界面

如何将Python切换成中文界面 Python 是一门非常受欢迎的编程语言&#xff0c;有着强大的编程能力和广泛的应用范围。一些朋友可能需要在中文环境下使用 Python&#xff0c;但是默认的 Python 界面是英文的&#xff0c;这给一些初学者带来了不便。本文将介绍如何切换 Python 的…

【操作系统】浅谈 Linux 中的中断机制

【操作系统】浅谈 Linux 中的中断机制 参考资料&#xff1a; [2015 SP] 北京大学 Principles of Operating System 操作系统原理 by 陈向群&#xff08;p7-p10&#xff09; 认认真真的聊聊中断 什么是软中断&#xff1f; 认认真真的聊聊"软"中断 操作系统-x86中断机…

安装nuxt3时一直报错 Error: Failed to download template from registry

一、这个错误提示表明&#xff0c;从GitHub仓库下载模板的请求失败&#xff0c;原因是无法解析raw.githubusercontent.com的地址。这可能是由于网络连接问题或DNS解析问题等原因引起的。 以下是一些可能解决此问题的步骤&#xff1a; 检查网络连接&#xff1a;确保您的网络连接…

JavaScript中的valueOf和toString方法

文章目录 I. 概述A. 引言B. 目的和意义 II. valueOf方法A. 定义和用法B. 默认行为C. 重写valueOf方法 III. toString方法A. 定义和用法B. 默认行为C. 重写toString方法 IV. valueOf VS toStringA. 区别和联系B. 使用场景比较 I. 概述 A. 引言 JavaScript中的valueOf和toStrin…

Docker和Kubernetes部署Spring Boot项目:如何灵活修改配置文件?

大家好&#xff0c;我是G探险者&#xff0c;今天我们来聊一下通过容器化部署的springboot项目&#xff0c;如何灵活的修改配置文件。 有同事问我&#xff0c;我们的springboot项目是容器化部署&#xff0c;使用的是K8S容器编排平台&#xff0c;部署上去后&#xff0c;修改项目…

Linux服务器配置SSH免密码登录后,登录仍提示输入密码(一次真实的问题排查解决记录)

我们知道两台Linux服务器机器之间如果使用ssh命令登录或scp/rsync命令传输文件每一次都需要输入用户名相对应的密码&#xff0c;如果要免密码&#xff0c;则需要对两台Linux服务器机器之间进行SSH互信。 一.SSH介绍 1.SSH互信原理 虽然这是废话&#xff0c;也希望大家了解一…