Vision Transformer(VIT)学习笔记

VIT学习笔记

VIT学习笔记

记录摸鱼时候的学习笔记–Vision Transformer(VIT)篇
论文链接:https://arxiv.org/pdf/2010.11929.pdf
代码链接:https://github.com/google-research/vision_transformer

基本组成部分

Linear Projection of Flattened Patches(Embedding层)、Transformer Encoder(处理位置信息,特征信息?)、MLP Head(类似于class head?)。结构图如下。
在这里插入图片描述

(1)Linear Projection of Flattened Patches(Embedding层)

输入不同于CNN滑动窗口方式的卷积,VIT采用不重叠的切割方式,将一张图片按照给定的大小切割成多个patch(16、32),例如在vit_base_16_224中,将224×224的输入图片,按照16×16大小的patch进行划分,最终可以得到14×14=196个patches作为输入。

Embedding层作用可以将一张图片切割出的所有patch通过线性映射后可以转换到二维矩阵中,转换过程:H×W×C–>N×(P×P×C),H、W、C分别为图像的高、宽、通道,N为patches的总数,P为patches的大小,C为每个patch的通道,也可以理解为每个patch被拉长成了一个一维向量。例如在vit_base_16_224中,转换过程224×224×3–>(14×14)×(16×16×3)–>196×768。每个一维的patch作为一个输入(图中1-9,之后需要统一Cat起来输入到encoder)。

第0个encoder的输入为该图像对应的类别(可训练的)。同图中1-9图像的输入格式一样,也是一个向量,例如在vit_base_16_224中,第0个输入则为1×768,将第0个输入和图像patch的映射结果拼接,最终得到197×768大小的矩阵。

位置编码,大小同(类别+patch)组成的矩阵shape一样,例如在vit_base_16_224中,位置编码shape为197×768,通过相加方式和(类别+patch)组合在一起。(个人理解可以通过位置编码给予每个patch对应在原图的位置信息)

(2)Transformer Encoder

Transformer Encoder由encoder block堆叠L次构成。根据论文transformer encoder结构图,每个encoder block可以由以下部分组成:layer normalization、multi-head attention和MLP。

Layer normalization(LN)。可以类比于BN,BN是对一个batch下所有数据的channel做normalization,LN是对一个batch下单个数据的某个维度做normalization。

Multi-head attention。可参考link

MLP。论文中:The MLP contains two layers with a GELU non-linearity. 代码中是两个全连接层,配合着GELU激活函数和dropout。

(3)MLP Head

输入输出encoder模块的矩阵大小是不变的,例如在vit_base_16_224中,输入的矩阵大小为197×768,那么输出的矩阵大小仍为197×768。实际上,只提取输出矩阵对应的类别信息的向量,例如在vit_base_16_224中,输出的矩阵大小为1×768,对应于输入encoder模块的类别信息。该模块可以理解为cls head。

猜你喜欢

转载自blog.csdn.net/qq_43114108/article/details/125685129