Vision Transformer(VIT)

VIT主要用于分类任务

一、VIT,即纯transformer模型

                                                        图1 VIT 架构

 

VIT模型的架构如图1所示。主要分为三个步骤:

1. 首先将输入的图片分成patches(如16*16的patch),然后将每个patch输入到Embedding层(即Linear Projection of Flattened Patches)得到一系列的向量(即token)。然后在这些token的最前面加上一个新的token,也就是用于分类的class token(图1中的*),这个class token的dimension和之前的每一个token一致。然后还需要加上位置的信息(即Position Embedding);

2. 得到上述token之后,输入到Transformer Encoder中。Transformer Encoder的结构如图1右侧所示;

3. 最后将class token所对应的输出,通过MLP Head得到最终分类的结果;

 

具体细节如下:

1. Embedding层

对于标准的Transformer模块,要求输入的是token(即向量序列),即二位矩阵[num_token, token_dim]

在代码中,直接通过一个卷积来实现。假设patch size为16,使用卷积核大小为16*16,stride为16,卷积核个数为768(16*16*3),即:

[224, 224, 3] -> [14, 14, 768] -> [196, 768]

在输入Transformer Encoder之前需要加上class token以及Position Embedding,都是可训练的参数。

然后拼接class token:concat([1,768], [196, 768]) -> [197, 768]

最后叠加Position Embedding:[197, 768] -> [197, 768]

 

2. Transformer Encoder层

 图2 Transformer Encoder结构

 

如图2所示,Transformer Encoder其实就是将Transformer Block重复堆叠L次。

 

3. MLP Head层

即Linear层。

 

二、Hybrid,即传统的CNN和Transformer混合模型

混合模型就是先使用传统的卷积神经网络(比如resnet网络)提取特征,然后再通过VIT模型进一步得到最终的结果。

使用ResNet50网络提取特征。但是再ResNet50网络上进行了修改:

1.  卷积层使用stdConv2d而不是传统的Conv2d;

2.  将所有的BatchNorm层替换成GroupNorm层;

3.  把stage4中的3个Block移至stage3中;

 

可以参照代码了解整个模型的流程。如https://github.com/jeonsworld/ViT-pytorch

posted @ 2023-07-03 22:11  指间的执着  阅读(307)  评论(0编辑  收藏  举报