当前位置:   article > 正文

Vision Transformer(ViT)_transformer的输入尺寸

transformer的输入尺寸

模型的整体架构

首先输入一张图像,然后将图像分成一个一个的小块(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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/616705
推荐阅读
相关标签
  

闽ICP备14008679号