VIT架构
【ViT论文逐段精读【论文精读】】 【精准空降到 30:29】 https://www.bilibili.com/video/BV15P4y137jb/?share_source=copy_web&vd_source=f09504571c3138e9e610217797aba3a4&t=1829
- 首先把图片分为几个Patch,比如我们此时输入的图片为
224*224*3
,我们这里使用16*16
的Patch size大小,那么可以得到N=224*224/16^2=196=14^2
,也就是196个图像块,每一个图像块的大小是16*16*3=768
的维度,也就是196*768
维度 - 然后通过一个线性投射层
- 我们给这个 Patch Embedding加上一个位置信息,并且在开头加上一个cls(类似Bert)最后面用来
- 然后就把这些加入到一个Transformer Encoder去,最后又很多输出。我们拿cls当做一个token来输入后的结果当做分类的依据,后面可以再接上一个MLP来进行分类
过程
首先把图片分为几个Patch,比如我们此时输入的图片为224*224*3
,我们这里使用16*16
的Patch size大小,那么可以得到N=224*224/16^2=196=14^2
,也就是196个图像块,每一个图像块的大小是16*16*3=768
的维度,也就是196*768
维度
然后经过经过一个全连接层(中间粉色的),他的输入是768,也就是原来得到的每一个Patch的维度,后面得到一个Embedding的维度,我们设为D,这里我们让D和输入一样,也就是D也是768。当然D是可以变得。最后出来的维度还是196*768
除了图像本身的token以外,我们还要再加一个cls token
用来分类,所以最后进入Transformer Encoder的维度就是(196 + 1) * 768
然后我们加上一个位置编码信息,这里的位置编码信息是要去学习的,没有采用那个sin和cos那个位置编码。具体做法是有一个矩阵,每一行代表一个位置编码向量,向量维度就是768,也就是D,然后将位置编码加到(不是ConCat)Embedding上去。到此Transformer的输入就构造完了,维度是197*768
然后就进入Transformer中去。假设我们其中的多头注意力的头是12个。那么每个部分就是768/12=64
,那么每个QKV
就是197*64
一共12个这样的。最后把结果拼接起来就又是197*768
了。
然后经过Layer Norm和MLP,一般MLP中先把他变大(比如四倍),然后再投射回原来的维度,最后出来还是197*768
mean attention distance
d a b = l a b ∗ w a b d_{ab}=l_{ab} * w_{ab} dab=lab∗wab
Vit中的Attention distance是怎么做的,有什么物理意义? - Glenn的回答 - 知乎
https://www.zhihu.com/question/492429589/answer/3097896708