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