2021年风最大的当属Transformer了,接下来就出一个transformer的专栏,记录2021年以来最新的transformer网络。首先就从谷歌大脑实验室的ViT网络开始吧!
点击下载论文
点击下载代码
一、vision transformer输入
1.1输入
原始transformer是用于NLP领域中,本文将transformer成功应用到图像分类领域。要想将原始transformer应用到图像处理任务中,首先要解决的问题就是如何将二维输入影像转为一维输入序列,ViT的做法是直接将原图切片,然后强制转为一维序列作为输入。具体步骤如下:
假设输入图像为:
切片大小为:P×P,切成N个小图
切片后的小图尺寸为:
其中N = HW/PP,N是序列的长度,也代表着处理的效率
最后将展平的切片通过以下公式映射到D维向量大小中。
1.2class token
和经典图像分类算法BERT相似,在输入(N×D)中增加class token,作为新的输入,即将真实分类结果加进去,新的输入维度为(N+1)×D
1.3 position embedding
采用给每个patch添加位置编码来让每个切片保持位置信息,本文采用1维可学习参数位置编码,因为作者发现采用2维的位置编码也没有很好的提升。
二、网络结构
2.1总体网络结构
首先把原图切分为N个patch,每个patch添加位置编码,输入金Transformer Encoder中,其中Encoder 由多层的 multiheaded self-attention(MSA)和 MLP 组成,如右图所示,每层之前都会使用归一化。具体的encoder计算过程如下:
2.2微调和高分辨
通常,我们在大型数据集上预先训练ViT,并微调到(较小的)实际训练任务中。因此,我们首先需要移除预训练的预测头,再添加一个零初始化的D × K前馈层,其中K是实际训练任务类别的类别数。有一篇文章证明通过比预训练更高的分辨率进行微调通常效果不错。当反馈到更高分辨率的图像时,我们保持切片大小不变,这就导致更大的有效输入序列长度。ViT原则上可以处理任意序列长度(最大内存限制),但是,预训练的位置编码可能不再有意义。因此,我们根据原始图像中的位置编码来对预训练的位置编码进行2D插值。
请注意,分辨率调整和切片提取是手动将图像2D结构的感应偏差输入到ViT的唯一点。
感应偏差:ViT比普通神经网络 具有更少的感应偏差,因为ViT中,只有MLP层能获取到局部特征,而MSA是全局的,因此需要通过在模型开始微调训练,就调整不同分辨率的位置编码。
3.实验结果
ViT有三种规格的网络,分别为ViT-base、ViT-large、ViT-huge。
其中,ViT- H/14代表ViT的huge模型,切片大小为14,ViT- L/16代表ViT的large模型,切片大小为16。将其与最好的骨干网路进行对比分析,结果如下:
且在不同图像分类数据集中,ViT均表现良好,优于其他模型。
为比较不同量级的数据集,ViT的表现,分别在三种不同量级的数据集上进行试验,结果如下: