Vision Transformer是用Transformer架构解决视觉问题。其可以在不做改动来解决计算机视觉问题。
其在小规模数据上略输卷积神经网络,而在中等或者大规模数据集上,表现相当或者优于卷积神经网络。在计算效率上,训练同等精度的模型,Transformer模型比卷积神经网络模型更有优势。
首先将图片按照固定大小分为一个个patch作为token。一个patch如何作为Embedding向量呢?
可以将这个图像的长乘以宽再乘以通道数的多维矩阵表示展平,再通过一个共享线性层投射到Transformer模型特征维度就完成1个图片转换为向量序列。
图片切片相当于文本中分词,而线性层相当于Embedding。接下来需要考虑位置编码。
在ViT中把位置编码为可学习向量,直接加在图像Token向量上。其参考BERT模型,在前面添加1个可学习的分类头。后面用的是Transformer Encoder,因此每个Token都可以看到所有Token。
其网络结构如下图所示:

其模型类型可分为3种:
- ViT-Base
- ViT-Large
- ViT-Huge
其中ViT-L/16表示使用的是ViT-Large模型,patch尺寸为16x16。其中patch size越小,序列越长,计算代价越大。
下面介绍下图像转化为Embedding序列的两种实现方式:
训练图片大小为224x224,patch大小为16x16,patch数量为14x14。而Transformer里的特征维度(Hidden Size)为1024。
第一种方式是采用线性映射,将原始图片拆分为多个patch,对于每个patch,shape为(16,16,3),展开为1个长度为768的一维向量,然后通过一个共享的(768,1024)的线性层进行编码。
第二种方式是卷积操作,直接对原始图片,定义1024个卷积核,每个卷积核大小为patch大小(16,16),步长为16,padding为valid。
这两种操作是完全等价的。
另外Encoder输出分类也有两种方法:
- 增加一个分类头[cls]token,用最后的Encoder对这个token的输出提取全局信息
- 不增加token,用最后Encoder的所有token的向量的全局平均池化GAP提取全局信息
最后,原作者也在该网络上尝试自监督学习。其借鉴BERT,对50%的patch进行标记,其中的80%标记为可学习的[mask]标签,10%替换为其他patch的Embedding,剩余10%维持不变。
而预测像素值时,原来是RGB数量255x255x255=16581375色转换为预测8x8x8=256色,效果非常不错。
参考视频:
