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

论文的提出#
直接使用ViT在大规模数据集中预训练的基础上,去小数据集上做微调,效果会更好。
这个最重要的是提出了,怎么把一个图片变为一个一个token,也就是我们所说的打成patch
像以前的工作是其实是有类似的工作了,但是他们是怎么处理这种这种序列长度的呢?一个是cnn抽特征,降低维度。一个是通过轴注意力,将HxW变成单独顺序做H和W。
论文自己是怎么做的呢?
就是将图像划分网格(打成一个一个patch)

另外一个特点就是强调了将任务变为有监督训练。
然后就是相对训练便宜。
核心点#
大规模预训练,再微调,效果好(原先cnn有两个先验知识,相邻特征相似性,平移不变性,所以说,在大规模训练的时候,就是学习这些先验知识)
切分patch
训练成本相对较低
模型架构#

流程#
在 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操作是通过一个卷积来实现#

加上 cls token#
x 被 reshape 成 (batch, num_patches, hidden_dim)。
加上一个 \[CLS\] token(分类占位符),代表整个图像的全局语义信息。
拼接后序列长度变成 num_patches + 1。

加上位置编码#

多层 Transformer Encoder#

提取 cls 向量#

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

为什么?cls或者是gap?#
两者均可!!!!
为什么?做实验结果,效果差不多。
gap操作就是做一个全局的mean(求平均的操作)
效果分析#





如何做Loss#

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





