论文阅读笔记:Vision Transformer

前言

在视觉领域,注意力要么和卷积网络结合使用如上篇博客提到的DETR,要么替换卷积网络中的某些部分,同时保持整体结构不变。本文表明对CNNs的依赖不是必要的,纯转换器(pure transformer)直接应用于图像块(image patches)序列在图像分类任务中能发挥很好的作用。

当对大量数据进行预训练并把它转移到多个中型或者小型图像识别基准(ImageNet,CIFAR-100,VTAB,etc.)中,与SOTA卷积网络相比,Vision Transformer(ViT)获得了出色的结果,同时训练时需要更少的计算资源。
在这里插入图片描述
Transformer介绍博客:论文阅读笔记:Attention Is All You Need
DETR介绍博客:论文阅读笔记:End-to-End Object Detection with Transformers

论文原文:An Image Is Worth 16x16 Words: Transformers For Image Recognition At Scale
代码下载地址:GitHub - google-research/vision_transformer

VIT模型

Vision Transformer(ViT)的模型框架如图:
在这里插入图片描述
模型由三个模块组成:
· Linear Projection of Flattened Patches
· Transformer Encoder
· MLP Head

Linear Projection of Flattened Patches

标准的Transformer是把token embeddings的1维序列作为输入。为了处理2维的图像,需要把 H × W × C H×W×C H×W×C 的图像转换成 N × ( P 2 C ) N×(P^2C) N×(P2C) 的patch, ( H , W ) (H,W) (H,W)为原始图像的分辨率, C C C 为通道数, ( P , P ) (P,P) (P,P)是图像块的分辨率,N是patch数,也是Transformer有效输入序列长度。
如下图,以ViT-B/16(P=16)为例举例说明,输入 48 × 48 × 3 48×48×3 48×48×3的图像,每个patch的大小为 16 × 16 × 3 16×16×3 16×16×3,所以会划分得到 N = ( 48 / 16 ) ∗ ( 48 / 16 ) = 9 N = (48/16)*(48/16)=9 N=(48/16)(48/16)=9个patch。 [48,48,3] => [9,16,16,3]
接着,将9个[16,16,3]大小的patch通过类似于transformer的input embeding层,将每个patch映射成为一维token向量。[9,16,16,3] => [9,768]
在这里插入图片描述
patch线性映射关系如下:
在这里插入图片描述
其中E是 N × ( P 2 C ) N×(P^2C) N×(P2C)大小的patch,通过 x p i x_p^i xpi的线性映射,再在输入Transformer Encoder之前在序列前添加一个可学习的[class]token(公式(1)中的 x c l a s s x_{class} xclass,结构图中的 “ ∗ ” “*” ,concate([1,768],[9,768]]) => [10,768])其在Transformer编码器输出端的状态作为图像表示y(公式(4))。最后加上Position Embedding(公式(1)中的 E p o s E_{pos} Epos,结构图中的 “ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ” “0,1,2,3,4,5,6,7,8,9” “0,1,2,3,4,5,6,7,8,9”, E c l a s s , p a t c h + E p o s E_{class,patch}+E_{pos} Eclass,patch+Epos)。可以看到这里的Position Embedding不是之前self-transformer中使用的sin/cos得到的,而是是一维的位置编码。

在这里插入图片描述
论文后续的分析部分也进行了展示,分别不使用Pos.Emb.、使用1-D Pos.Emb.、2-D Pos.Emb.以及相对Pos.Emb.,实验发现不使用Position Embedding和使用Position Embedding相差3%的精度,而使用什么方式的Position Embedding对结果影响不大。故这里直接使用了1-D Position Embedding。
在这里插入图片描述

Transformer Encoder

在这里插入图片描述

Transformer编码器包括L层Muti-head Attention块和MLP块(公式(2),(3)),LN(LayerNormalization)应用于每个区块之前,以及每个区块之后的剩余连接(对于这块可查看之前的博文论文阅读笔记:Attention Is All You Need中的Encoder和Layer Normalization)。MLP块包含两层,全连接+GELU激活函数。

在这里插入图片描述
具体结构,后续会通过阅读VIT源码进行解析。

MLP Head

Transformer Encoder后输出的shape和输入的shape是保持不变的。最终如公式(4)所示,只需要提取出[class]token生成的对应结果 z L 0 z_L^0 zL0 进行LN(Layer Normalization),然后通过MLP Head即可。

在这里插入图片描述
论文中提到:
在这里插入图片描述
即Transformer model的output最后会通过一个 MLP+tanh激活函数(单个隐藏层中)来进行分类。说明MLP Head是由Linear + tanh + Linear。

SELF-SUPERVISION

论文中提到使用了自监督学习,不过通过自我监督预训练,较小的ViT-B/16模型在ImageNet上实现了79.9%的准确率,与从头开始的训练相比显著提高了2%,但仍落后于监督预训练4%。其中提到了余弦相似性(Cosine similarity):

余弦相似度是通过测量两个向量内积空间的余弦值来度量它们之间的相似性,尤其适用于任何维度的向量比较中,因此属于高维空间应用较多的机器学习算法。
引用自: 图像基础7 图像分类——余弦相似度

例如,图中的patch代表原图中3232的一块区域,共有(224/32) (224/32) = 77的区域。 每个块由77个小块构成,每个小块的颜色代表当前patch和该行索引和列索引对应patch的相似度,颜色越接近绿色相似度越低,越接近黄色,相似度越高。第一行第一列的patch,我们把它放大来看,发现最左上角的点是黄色,代表和第一行第一列的patch相似度最高(因为第一行第一列是本身的位置,相似度当然最高)。其次,第一行和第一列的相似度也较高,表示它和当前行以及当前列的patch相似度较高。其他位置的相似度就比较低了。以此类推,可以得到7*7个patch的相似度情况。
在这里插入图片描述

源码解析

请看博文:Vision Transformer(Pytorch版)代码阅读注释

  • 26
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flatten Transformer是一种使用Focused Linear Attention的Vision Transformer。它采用了类似于传统Transformer的self-attention结构,但在关注机制上进行了改进。具体来说,Flatten Transformer使用了Focused Linear Attention来代替传统的self-attention。Focused Linear Attention通过将注意力权重分配给图像的不同区域,使得模型能够更加关注重要的图像特征。 在Flatten Transformer中,图像首先被拆分成小块(patch),然后通过一个Embedding层转换成token。这个Embedding层将图像数据转换成一个向量,其形状为[num_token, token_dim,以适应Transformer Encoder的要求。接下来,Flatten Transformer使用Focused Linear Attention来计算每个token之间的关联性,并根据计算得到的注意力权重对它们进行加权求和。最后,经过Transformer Encoder和MLP Head的处理,模型可以输出对图像进行分类的结果。 关于Flatten Transformer的详细结构和实现,你可以参考引用中提供的论文和引用中提供的GitHub代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [狗都能看懂的Vision Transformer的讲解和代码实现](https://blog.csdn.net/weixin_42392454/article/details/122667271)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值