Vision Transformer(ViT)

模型的整体架构

首先输入一张图像,然后将图像分成一个一个的小块(patch),然后将所有的patch输入到Embedding层(即Liner Projection of Flattened Patches层)会得与每个patch对应的向量(称为token)。之后在这一系列token之前添加一个class token用于分类使用,维度大小和其他的token相同。然后需要给每一个token(包括class token)添加一个位置编码(Position Embeding),即图中的0、1……9。然后再将这些添加了位置编码的token输入到Transformer Encode中,只提取class token产生的对应输出送入MLP Head中,得到最终的分类结果。

Emdedding层

对于标准的Transformer模块,要求输入的是token(向量)序列,即二维矩阵,维度为[num_token,token_dim]。在代码实现中,直接通过一个卷积层来实现。以ViT-B /16为例(16代表图片划分的patch大小为16*16),输入图像的大小为224*224,使用卷积核大小为16*16、步长stride为16、卷积核个数为768的卷积层,然后将高度和宽度展平。于是shape变化为[224,224,3]->[14,14,768]->[196,768],即得到了196个token,每个token(向量)的维度是768。

在输入到Transformer Encode之前,需要加上可训练的参数class token和位置编码Position Embedding。首先初始化一个class token参数,维度大小和每个token的大小相同,即shape为[1,768],然后与其他token[196,768]进行concat拼接,得到新的shape为[197,768]。初始化位置编码的维度也要和每个token的维度相同,即shape为[1,768],然后每个位置编码与各自对应的token相加即可。最终的shape依旧为[197,768]。

Position Embedding

关于位置编码,论文中的实验结果如下:

可以看出使用了位置编码后效果有了提升,但是无论使用1-D位置编码、2-D位置编码还是相关位置编码,差异不是很大。因此在代码实现中使用了1-D位置编码,因为代码更简单、参数更少且效果更好。

Transformer Encoder

Transformer Encoder层是由N个重复堆叠的Encoder Block构成,Encoder Block的结构如下

首先,输入进入Norm层即Layer Norm(Layer Normalization),然后进入Multi-Head Attention,再进入Dropout/DropPath层(原论文中没提,但是源码中有)。之后再将初始输入与Dropout/DropPath层的输出结果进行add相加,然后将结果输入Layer Norm层、MLP Block层和Dropout/DropPath层,再将结果与输入Layer Norm层之前的结果进行add相加。

MLP Head

可以简单的理解为全连接层

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值