文章目录
一、简介
1. Vision Transformer(ViT)是一种基于Transformer架构的深度学习模型,它将Transformer模型从自然语言处理(NLP)领域成功扩展到计算机视觉(CV)领域。
2. Vision Transformer由Google Brain团队在2020年提出,该模型挑战了卷积神经网络(CNN)在视觉任务中的主导地位,证明了Transformer架构不仅在处理序列数据(如文本)方面非常有效,在处理图像数据时也能取得卓越性能。
3. Vision Transformer的核心思想是将输入的图像视为一个序列化的输入,通过自注意力机制来处理图像中的像素关系。具体而言,ViT首先将输入图像划分为多个固定大小的图像块(Patches),然后对每个图像块进行线性映射(Flattening + Linear Projection),将其转换成一个向量。这些向量连同一个特殊的分类Token一起作为Transformer的输入序列。这样,图像就被转换成了一个序列数据,从而可以直接应用自注意力机制进行特征提取。
二、模型结构
2.1 整体架构
ViT模型如下架构图所示,其中主要有三个部分组成:(1) Linear Projection of Flattened Patches(Embedding层,将子图映射为向量);(2) Transformer Encoder(编码层,对输入的信息进行计算学习);(3) MLP Head(用于分类的层结构)。
2.2 Linear Projection of Flattened Patches
1. Linear Projection of Flattened Patches(平铺块的线性投影)是ViT模型架构中的一个重要组成部分。这个过程主要涉及到将输入的图像数据转换为Transformer模型能够处理的一维向量序列。
2. 作用与目的:
(1)图像数据转换:由于标准的Transformer模型接收的是一维的嵌入序列,而图像数据是三维的(高度H、宽度W、通道数C),因此需要通过线性投影将图像数据转换为Transformer能够处理的格式。
(2)信息提取:通过平铺和线性投影,图像被划分为多个小块(Patches),每个小块被转换为一个一维向量,这些向量包含了图像中的局部信息。
3. 具体步骤:
(1)图像划分:将输入图像按照预定的尺寸(如16x16)划分为多个小块(Patches)。以ViT-B/16为例,如果输入图像的大小为224x224,则会被划分为(224/16)x(224/16)=196个小块。
(2)平铺操作:将每个小块展平(Flatten)为一维向量。
(3)线性投影:使用一个线性层(通常是卷积层)将每个展平后的小块映射到一个更高维的向量空间中。这个线性层的作用是将每个小块的特征进行抽象和整合,以便后续的自注意力机制能够处理。以ViT-B/16为例,线性投影层通常使用一个卷积核大小为16x16、步距为16、卷积核个数为768的卷积来实现。这个卷积操作会生成一个形状为[14, 14, 768]的特征图(由于步距为16,所以高度和宽度都减少了),然后将其展平为[196, 768]的形状,即196个长度为768的向量(后面都直接称为token)。
(4)添加特殊Token和位置编码:在所有向量序列的开头添加一个特殊的class Token(分类Token),用于后续的图像分类任务。这个Token是一个可训练的参数,与其他向量具有相同的维度。给每个向量添加一个位置编码(Position Embedding),以保留它们在图像中的位置信息。位置编码通常是可学习的,并且与向量的维度相同。
4. 图像分块代码块:
class PatchEmbed(nn