Vision Transformer详解

论文名称: An Image Is Worth 16x16 Words: Transformers For Image Recognition At Scale
论文下载链接:https://arxiv.org/abs/2010.11929
原论文对应源码:https://github.com/google-research/vision_transformer

Pytorch实现代码: pytorch_classification/vision_transformer
Tensorflow2实现代码:tensorflow_classification/vision_transformer
在bilibili上的视频讲解:https://www.bilibili.com/video/BV1Jh411Y7WQ



前言

Transformer最初提出是针对NLP领域的,并且在NLP领域大获成功。这篇论文也是受到其启发,尝试将Transformer应用到CV领域。关于Transformer的部分理论之前的博文中有讲,链接,这里不在赘述。通过这篇文章的实验,给出的最佳模型在ImageNet1K上能够达到88.55%的准确率(先在Google自家的JFT数据集上进行了预训练),说明Transformer在CV领域确实是有效的,而且效果还挺惊人。

vit


模型详解

在这篇文章中,作者主要拿ResNet、ViT(纯Transformer模型)以及Hybrid(卷积和Transformer混合模型)三个模型进行比较,所以本博文除了讲ViT模型外还会简单聊聊Hybrid模型。

Vision Transformer模型详解

下图是原论文中给出的关于Vision Transformer(ViT)的模型框架。简单而言,模型由三个模块组成:

  • Linear Projection of Flattened Patches(Embedding层)
  • Transformer Encoder(图右侧有给出更加详细的结构)
  • MLP Head(最终用于分类的层结构)
    vit

Embedding层结构详解

对于标准的Transformer模块,要求输入的是token(向量)序列,即二维矩阵[num_token, token_dim],如下图,token0-9对应的都是向量,以ViT-B/16为例,每个token向量长度为768。

encoder
对于图像数据而言,其数据格式为[H, W, C]是三维矩阵明显不是Transformer想要的。所以需要先通过一个Embedding层来对数据做个变换。如下图所示,首先将一张图片按给定大小分成一堆Patches。以ViT-B/16为例,将输入图片(224x224)按照16x16大小的Patch进行划分,划分后会得到 ( 224 / 16 ) 2 = 196 (224/16)^2=196 (224/16)2=196个Patches。接着通过线性映射将每个Patch映射到一维向量中,以ViT-B/16为例,每个Patche数据shape为[16, 16, 3]通过映射得到一个长度为768的向量(后面都直接称为token)。[16, 16, 3] -> [768]

在代码实现中,直接通过一个卷积层来实现。 以ViT-B/16为例,直接使用一个卷积核大小为16x16,步距为16,卷积核个数为768的卷积来实现。通过卷积[224, 224, 3] -> [14, 14, 768],然后把H以及W两个维度展平即可[14, 14, 768] -> [196, 768],此时正好变成了一个二维矩阵,正是Transformer想要的。

在输入Transformer Encoder之前注意需要加上[class]token以及Position Embedding。 在原论文中,作者说参考BERT,在刚刚得到的一堆tokens中插入一个专门用于分类的[class]token,这个[class]token是一个可训练的参数,数据格式和其他token一样都是一个向量,以ViT-B/16为例,就是一个长度为768的向量,与之前从图片中生成的tokens拼接在一起,Cat([1, 768], [196, 768]) -> [197, 768]。然后关于Position Embedding就是之前Transformer中讲到的Positional Encoding,这里的Position Embedding采用的是一个可训练的参数(1D Pos. Emb.),是直接叠加在tokens上的(add),所以shape要一样。以ViT-B/16为例,刚刚拼接[class]token后shape是[197, 768],那么这里的Position Embedding的shape也是[197, 768]

embedding

对于Position Embedding作者也有做一系列对比试验,在源码中默认使用的是1D Pos. Emb.,对比不使用Position Embedding准确率提升了大概3个点,和2D Pos. Emb.比起来没太大差别。
Position Embedding


Transformer Encoder详解

Transformer Encoder其实就是重复堆叠Encoder Block L次,下图是我自己绘制的Encoder Block,主要由以下几部分组成:

  • Layer Norm,这种Normalization方法主要是针对NLP领域提出的,这里是对每个token进行Norm处理,之前也有讲过Layer Norm不懂的可以参考链接
  • Multi-Head Attention,这个结构之前在讲Transformer中很详细的讲过,不在赘述,不了解的可以参考链接
  • Dropout/DropPath,在原论文的代码中是直接使用的Dropout层,在但rwightman实现的代码中使用的是DropPath(stochastic depth),可能后者会更好一点。
  • MLP Block,如图右侧所示,就是全连接+GELU激活函数+Dropout组成也非常简单,需要注意的是第一个全连接层会把输入节点个数翻4倍[197, 768] -> [197, 3072],第二个全连接层会还原回原节点个数[197, 3072] -> [197, 768]

encoder


MLP Head详解

上面通过Transformer Encoder后输出的shape和输入的shape是保持不变的,以ViT-B/16为例,输入的是[197, 768]输出的还是[197, 768]。注意,在Transformer Encoder后其实还有一个Layer Norm没有画出来,后面有我自己画的ViT的模型可以看到详细结构。这里我们只是需要分类的信息,所以我们只需要提取出[class]token生成的对应结果就行,即[197, 768]中抽取出[class]token对应的[1, 768]。接着我们通过MLP Head得到我们最终的分类结果。MLP Head原论文中说在训练ImageNet21K时是由Linear+tanh激活函数+Linear组成。但是迁移到ImageNet1K上或者你自己的数据上时,只用一个Linear即可。

mlp head


自己绘制的Vision Transformer网络结构

为了方便大家理解,我自己根据源代码画了张更详细的图(以ViT-B/16为例):

vit-b/16


Hybrid模型详解

在论文4.1章节的Model Variants中有比较详细的讲到Hybrid混合模型,就是将传统CNN特征提取和Transformer进行结合。下图绘制的是以ResNet50作为特征提取器的混合模型,但这里的Resnet与之前讲的Resnet有些不同。首先这里的R50的卷积层采用的StdConv2d不是传统的Conv2d,然后将所有的BatchNorm层替换成GroupNorm层。在原Resnet50网络中,stage1重复堆叠3次,stage2重复堆叠4次,stage3重复堆叠6次,stage4重复堆叠3次,但在这里的R50中,把stage4中的3个Block移至stage3中,所以stage3中共重复堆叠9次。

通过R50 Backbone进行特征提取后,得到的特征矩阵shape是[14, 14, 1024],接着再输入Patch Embedding层,注意Patch Embedding中卷积层Conv2d的kernel_size和stride都变成了1,只是用来调整channel。后面的部分和前面ViT中讲的完全一样,就不在赘述。

r50+vit-b/16

下表是论文用来对比ViT,Resnet(和刚刚讲的一样,使用的卷积层和Norm层都进行了修改)以及Hybrid模型的效果。通过对比发现,在训练epoch较少时Hybrid优于ViT,但当epoch增大后ViT优于Hybrid。

vit vs hybrid


ViT模型搭建参数

在论文的Table1中有给出三个模型(Base/ Large/ Huge)的参数,在源码中除了有Patch Size为16x16的外还有32x32的。其中的Layers就是Transformer Encoder中重复堆叠Encoder Block的次数,Hidden Size就是对应通过Embedding层后每个token的dim(向量的长度),MLP size是Transformer Encoder中MLP Block第一个全连接的节点个数(是Hidden Size的四倍),Heads代表Transformer中Multi-Head Attention的heads数。

ModelPatch SizeLayersHidden Size DMLP sizeHeadsParams
ViT-Base16x161276830721286M
ViT-Large16x16241024409616307M
ViT-Huge14x14321280512016632M
  • 1160
    点赞
  • 4157
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 151
    评论
### 回答1: Vision Transformer(视觉Transformer)是一种基于Transformer架构的深度学习模型,主要用于图像分类和目标检测任务。与传统卷积神经网络不同,Vision Transformer使用了全局自注意力机制,使得模型可以更好地捕捉到不同位置之间的关系。Vision Transformer已经在ImageNet等大规模数据集上取得了优秀的性能表现,并逐渐成为深度学习领域的研究热点。 ### 回答2: Vision TransformerViT)是一种全新的视觉识别模型,由谷歌提出,它借鉴了自然语言处理领域中的transformer技术。ViT图像分类、目标检测和分割等视觉任务中均有较好的效果,并且在一些任务中超越了传统的卷积神经网络(CNN)模型。 ViT模型的核心是transformer encodertransformer decoder两大部分。transformer encoder负责将输入序列转换成特征向量,而transformer decoder则是根据特征向量生成目标输出序列。在ViT模型中,将一张图片视为一个大小为H×W的序列,然后再通过一些处理,将会得到一个大小为N的特征向量,其中每个元素代表了原图中的一个位置坐标。 ViT模型通过将一张图像划分成大小为P × P的图块,然后将每个图块拼接成一个序列,来处理整个图像。基于这样的序列表示方式,ViT将应用transformer架构对序列进行处理,以生成特征表示。同时,由于传统的transformer是为自然语言处理领域设计的,所以需要对其进行一定的调整,才能适用于图像处理任务。因此,ViT引入了一个叫做“patch embedding”的操作,它将每个P × P的图块映射成一个特征向量,然后再进行transformer处理。 除此之外,在ViT模型中还使用了一些其他的技术来提升模型的性能,包括:1)将transformer encoder中的自注意力替换为多头注意力,以增加模型的并行性和泛化性;2)在每个transformer block中应用残差连接和归一化,以加速训练、提高稳定性和精度;3)引入了一个分类头,用于将特征向量转换为最终的输出类别概率。这些技术的应用均使得ViT模型在视觉识别任务上表现出了很好的效果。 总之,ViT模型是一种基于transformer架构的新型视觉识别模型,它采用多头注意力、残差连接等技术,将图像视为序列,利用transformer encodertransformer decoder对序列进行处理,并最终输出目标类别概率。相比于传统的CNN模型,在一些任务中ViT具有更优秀的表现,有望成为未来视觉处理领域的新趋势。 ### 回答3: Vision TransformerViT)是谷歌的一款新型视觉模型,与传统的卷积神经网络(CNN)不同,ViT是由注意力机制(Attention Mechanism)组成的纯粹Transformer模型。Transformer源于自然语言处理领域,它能解决文本序列问题,但对于图像数据来说,采用Transformer是一个全新的尝试。 ViT将图像分割成固定数量的块(例如16*16),每个块被视为一个向量。这些向量然后传递给Transformer编码器,其中包括多层自注意力机制。通过学习这些向量之间的相互作用,模型能够提取出各个块之间的关键信息。最后,全连接层通过分类器将最终向量映射到相应的类别。 相较于传统CNN,ViT的明显优势是无需人工设计的特征提取器,这使得模型更具通用性,适用于各种视觉任务,并且能够处理多种分辨率和大小的图像。同时,attention机制带来的优点也让ViT在处理长时间序列信息时表现突出。 然而ViT在使用时还存在一些挑战。由于图像信息需要被分割成固定大小的块,因此对于具有细长结构的对象(如马路、河流等),模型很容易将它们拆分为多个块,导致信息的丢失。此外,由于向量长度的限制,ViT的处理能力存在局限性。 在处理大规模数据时,ViT还需要面对计算资源的挑战。为解决这一问题,研究人员提出了一系列改进算法,如DeiT、T2T-ViT、Swin Transformer等,它们能够更好地处理大规模图像数据。 总的来说,Vision Transformer模型是一种全新的尝试,它使用自注意力机制构建纯Transformer模型来处理图像数据。虽然存在一些性能挑战,但随着技术的不断进步和改进算法的诞生,ViT模型必将成为图像处理领域的重要一员。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 151
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳花的小绿豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值