AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE
摘要
虽然Transformer体系结构已经成为自然语言处理任务的事实上的标准,但它在计算机视觉方面的应用仍然有限。在视觉上,注意力要么与卷积网络结合使用,要么用于替换卷积网络的某些组件,同时保持其整体结构不变。我们表明,这种对CNN的依赖是不必要的,直接应用于图像块序列的纯变换可以很好地执行图像分类任务。在对大量数据进行预训练并传输到多个中型或小型图像识别基准(ImageNet、CIFAR-100、VTAB等)时,视觉转换器(VIT)与最先进的卷积网络相比获得了优异的结果,而训练所需的计算资源要少得多。
模型架构
模型概述。我们将图像分割成固定大小的块,线性地嵌入每个块,添加位置嵌入,并将生成的向量序列提供给标准的Transformer编码器。为了执行分类,我们使用标准方法,即向序列中添加额外的可学习“分类令牌”。Transformer编码器的插图灵感来自Vaswani等人(2017)。
模块构成:
transformer Encoder中使用了多头注意力:参考Multi Head Attention
Embedding层
对于标准的Transformer模块,要求输入的是token
(向量)序列,即二维矩阵[num_token, token_dim]
Embedding层
在代码实现中,直接通过一个卷积层来实现以ViT- B/16为例,使用卷积核大小为16x16,stride为16,
卷积核个数为768
[224, 224, 3] -> [14, 14, 768] -> [196, 768]
768对应的就是token_dim(向量的长度)
在输入Transformer Encoder之前需要加上[class]token
以及Position Embedding,都是可训练参数
拼接[class]token: Cat([1, 768], [196, 768]) -> [197, 768]
叠加Position Embedding: [197, 768] -> [197, 768]
使用相加的方式叠加的位置编码(维度保持了不变)
Transformer Encoder层
的详细结构为:
MLP Head
训练ImageNet21K时是由Linear+tanh激活函数+Linear
但是迁移到ImageNet1K上或者你自己的数据上时,只有一个Linear (全连接层)
需要得到每个类别的类别概率,还需要softmax激活函数