VIT,文章题名为An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale,发表于2020年10月。基于纯Transformer结构来做图像分类任务,论文中相关实验证明在大规模数据集上做完预训练后的ViT模型,在迁移到中小规模数据集的分类任务上以后,能够取得比CNN更好的性能。
✨1 网络结构
如上图,按照红框可分为四块:
图像预处理:Transformer不能直接处理图像。因此,需要将图像分层NxN的图像块。如果图像分辨率变大,而要求图像块尺寸不变,增加图像块数量即可。
展平层:第二个红框(Linear Projection of Fallttened Patches)将图像块展平为一维(NxN=>N^2X1)。
Transformer Encoder:依次赋予展平的图像块类别记号和位置编码并输入Transormer的编码器,输出结果。注意,因为这里是分类任务而不是生成任务,因此不需要解码器。
MLP:取Transformer编码器输出的第一个embedding,将其输入到分类网络,即MLP中,输出所属类别概率
✨2 Transformer Encoder
Transformer原理在另一个文章中总结过,这里主要介绍之前没有提过的类别记号
假设,图像经过预处理和展平层后得到维度为(Batch size, block_num, D)的矩阵X。
🍔2.1 类别记号
如果没有class token,我们将X与位置编码相加再通过Transformer Encoder后,仍然输出维度为(Batch size, Block num, D)的矩阵。但是输入分类网络的变量维度只需要(Batch size, 1, D),这就很难决定用Block num个变量中哪一个进行分类。(原因)
因此,输入Tranformer Encoder之前,将X与一个维度为(Batch size, 1, D)的类别记号编码进行拼接,最终维度为(Batch size, Block num + 1, D),然后与维度为(Batch size, Block num + 1, D)的位置编码相加,并输入Transformer Encoder。最终输出结果的维度为(Batch size, Block num+1, D),此时利用切片,获得第一个变量(Batch size, 1, D)输入MLP进行分类。(具体做法)
省略Batch Size维度该过程如下图:
需要注意的是,类别记号也是一个可学习编码变量,正常初始化即可。
✨3 MLP
MLP结构如下,其中FC(全连接层)和tanh(激活函数)可选,Linear用于分类。