ViT学习笔记(二) Patch+Position Embedding阶段的详细推演与理解
我认为讲得最好的一个文章:Vision Transformer详解-CSDN博客
有很多文章,自己并没有完全正确理解。
我的笔记,以ViT的标准应用为例:
• 输入图像:输入图像的尺寸是224x224,且是RGB图像,因此输入张量的形状是 (224, 224, 3)。
• Patch大小 patch_size: patch_size x patch_size = 16x16,这意味着每个patch的尺寸是16x16像素,且包含RGB3个颜色通道。如果以像素值为统计单位,每个Patch的大小是16*16*3 = 768。
• Patch数量:将224x224的图像分割成16x16的patch,得到的patch数量为 (224/16) x (224/16) = 14 x 14 = 196 个patch。
• 卷积、映射以及展平patch:使用一个卷积层( nn.Conv2d ),其卷积核大小( kernel_size )和步长( stride )均等于 patch_size = 16 ,16*16*3 = 768,这个卷积层实际上执行了一个线性变换,将每个 patch 展平成一个一维向量,其长度为 embed_dim = 768。当前共有14 * 14 = 196 个patch,所以,到了这个步骤,得到的向量的形状是:[196, 768]。
• 添加位置信息:为了保留每个patch在图像中的相对位置信息,ViT使用位置embedding。位置embedding是一个可学习的参数,形状为 [196, 768],其中196是patch的数量,768是每个patch的embedding维度。
加法操作:将位置embedding加到patch embedding上,两个等维度矩阵相加后维度不变,到了这个步骤,得到的向量的形状仍然是:[196, 768]。
• Class Token(类别标记):在Transformer模型中,需要一个特殊的标记来聚合全局信息并进行分类,所以引入一个可学习的 class_token ,其维度与 embed_dim = 768 相同,初始化为零向量或其他值。将 class_token 添加到嵌入后的 patch 序列的开始位置,到了这个步骤,得到的向量的形状是:[197, 768]。
经过以上步骤,获得了形状为[197, 768]的特征向量,将其送入编码器。