跳过正文
  1. 日常记录、技术札记与转载收藏。/

ViT

·3 分钟·
目录

下面详细分析一下ViT,这个开启了cv的新时代。在cnn处理不好的地方,在vit却是可以很好的处理。

Image

论文的提出
#

直接使用ViT在大规模数据集中预训练的基础上,去小数据集上做微调,效果会更好。

这个最重要的是提出了,怎么把一个图片变为一个一个token,也就是我们所说的打成patch

像以前的工作是其实是有类似的工作了,但是他们是怎么处理这种这种序列长度的呢?一个是cnn抽特征,降低维度。一个是通过轴注意力,将HxW变成单独顺序做H和W。

论文自己是怎么做的呢?

就是将图像划分网格(打成一个一个patch)

Image

另外一个特点就是强调了将任务变为有监督训练。

然后就是相对训练便宜。

核心点
#

  1. 大规模预训练,再微调,效果好(原先cnn有两个先验知识,相邻特征相似性,平移不变性,所以说,在大规模训练的时候,就是学习这些先验知识)

  2. 切分patch

  3. 训练成本相对较低

模型架构
#

Image

流程
#

在 Vision Transformer \(ViT\) 中,首先将输入图像划分为固定大小的 patch(如 16×16)。每个 patch 被展平后输入到一个线性投射层(Linear Projection),映射为一个固定维度的特征向量,从而得到一系列 patch 的特征表示。

随后,为了让模型能够识别这些 patch 的空间顺序信息,在每个 patch 的特征向量上加上一个可学习的位置编码(Positional Embedding)。此外,在序列的最前面会插入一个特殊的 \[CLS\](classification)标记,用于在后续的自注意力(Self-Attention)过程中汇聚整张图像的全局信息。

接着,这个带有位置信息的序列会被输入到标准的 Transformer Encoder 中进行特征提取。Transformer 的多头自注意力机制能够在不同 patch 之间进行全局信息交互,使

\[CLS\]

标记逐步融合来自整张图像的特征。

最后,通过一个多层感知机(MLP)作用在

\[CLS\]

向量上,对其进行分类预测,从而输出图像所属的类别。

代码分析
#

输入图像 → Patch Embedding → 加上 cls token → 加上位置编码 →

多层 Transformer Encoder → 提取 cls 向量 → MLP Head 分类

Patch Embedding操作是通过一个卷积来实现
#

Image

加上 cls token
#

x 被 reshape 成 (batch, num_patches, hidden_dim)

加上一个 \[CLS\] token(分类占位符),代表整个图像的全局语义信息。

拼接后序列长度变成 num_patches + 1

Image

加上位置编码
#

Image

多层 Transformer Encoder
#

Image

提取 cls 向量
#

Image

里面有一个点很关键哦?cls = self.param\('cls', nn.initializers.zeros, \(1, 1, c\))一个和隐藏层相等大小的可学习矩阵

MLP Head 分类
#

Image

为什么?cls或者是gap?
#

两者均可!!!!

为什么?做实验结果,效果差不多。

gap操作就是做一个全局的mean(求平均的操作)

效果分析
#

Image
Image
Image
Image
Image

如何做Loss
#

Image

笑死,万年不变的交叉损失!!!

相关文章