【11.1 Vision Transformer(vit)网络详解-哔哩哔哩】 https://b23.tv/BgsYImJ
工作流程:
①将输入的图像进行patch的划分
②Linear Projection of Flatted patches,将patch拉平并进行线性映射生成token
③生成CLS token(用向量有效地表示整个输入图像的特征)特殊字符“*”,生成Position Embedding,用Patch+Position Embedding相加作为inputs token
④Transformer Encoder编码,特征提取
⑤MLP Head进行分类输出结果
图片分块嵌入:
对于标准的Transformer模块,要求输入的是token(向量)序列,即二维矩阵[num_token,token_dim]
在代码实现中,直接通过一个卷积层来实现VIT-,使用卷积核大小为16*16,stride=16,卷积核个数为768
输入图片大小为224x224,将图片切分为固定大小16x16的patch,则每张图像会生成224x224/16x16=196个patch,输出序列为196;
196个patch(196x3)通过线性投射层(3x768)之后的维度为196x768,即一共有196个token,每个token的维度是768
在输入Transformer Encoder之前需要加上[class]token以及Position Embedding,都是可训练的参数
拼接[class]token:Cat([1,768],[196,768])->[197,768]
叠加:
Embedding层:
Learnable embedding(可学习的嵌入):
它是一个可学习的向量,它用来表示整个输入图像的信息;这个向量的长度是 768。
Position Embedding:
如图,编号有0-9的紫色框表示各个位置的position embedding,而紫色框旁边的粉色框则是经过linear projection之后的flattened patch向量。这样每一个 token 既包括图像信息又包括了位置信息
ViT的Position Embedding采用的是一个可学习/训练的 1-D 位置编码嵌入,是直接叠加在tokens上
使用余弦相似度来表明任意两个patches之间在位置上的关联程度
Transformer Encoder:
Encoder输入的维度为[197, 768],输出的维度为[197, 768],可以把中间过程简单的理解成为特征提取的过程
Transformer Encoder就是将Encoder Block重复堆叠L次
流程:
①Layer Norm层中使用Layer Normalization
②Multi-Head Attention
③Dropout层,论文中使用Dropout,但实际中使用DropPath效果更好
④捷径分支与输入进行相加操作,类似ResNet残差结构
⑤Layer Norm接MLP Block
⑥再接Dropout
⑦捷径分支
MLP Head:
定义:
MLP Head 是指位于模型顶部的全连接前馈神经网络模块,用于将提取的图像特征表示转换为最终的分类结果或其他预测任务输出。MLP Head 通常跟在 Transformer Encoder 的输出之后,作为整个模型的最后一层。
可以简单理解为一个全连接层,若需要类别概率需要再接上一个softmax激活函数
注意:
在Transformer Encoder前有个Dropout层,后有一个Layer Norm
训练ImageNet21K是由Linear+tanh激活函数+Linear
迁移到ImageNet1K上或自己的数据上,只有一个Linear
MLP Block:
如图下图所示,就是全连接+GELU激活函数+Dropout组成也非常简单,需要注意的是第一个全连接层会把输入节点个数翻4倍[197, 768] -> [197, 3072],第二个全连接层会还原回原节点个数[197, 3072] -> [197, 768]
注意:
第一个全连接层是输入节点个数的四倍
第二个全连接层将输入还原为原来的大小
VIT-B/16模型结构:
Vision Transformer维度变换:
流程:
①输入图像的input shape=[1,3,224,224],1是batch_size,3是通道数,224是高和宽
②通过patch embedding,由卷积核和faltten组成,因为是16*16的卷积核,个数为768,步距为16,数据变为14*14*768;高度和宽度方向进行展平处理,变为196*768
③concat上一个class token(可训练参数),196*768和1*768拼接为197*768
④与position embedding(可训练参数)相加,相加操作保持shape一致
⑤通过Dropout层
⑥经过Transformer Encoder,将Encoder Block重复L次(VIT-B/16中重复12次)
⑦得到Layer Norm的数据是197*768
⑧提取class token对应的输出,对输入进行切片,提取class token输出1*768
⑨通过MLP Head 得到最终输出,pre-logits是一个全连接层+tahn激活函数
其余:
Layer是Transformer Encoder中重复堆叠Encoder Block的次数
Hidden Size是通过Embedding层后每个token的dim(向量长度)
MLP size是Transformer Encoder中MLP Block第一个全连接的节点个数(是Hidden Size的四倍)
Heads代表Transformer中Multi-Head Attention的heads数
混合模型:
用传统的卷积神经网络提取特征,然后通过VIT进一步得到最终结果
R50的卷积层采用的是StdConv2d,不是传统的Conv2d
将所有的BatchNorm层替换成GroupNorm层
把stage4中的三个Block移到stage3中