深度学习(10)---Vision Transformer详解


一、简介

 1. Vision Transformer(ViT)是一种基于Transformer架构的深度学习模型,它将Transformer模型从自然语言处理(NLP)领域成功扩展到计算机视觉(CV)领域。

 2. Vision Transformer由Google Brain团队在2020年提出,该模型挑战了卷积神经网络(CNN)在视觉任务中的主导地位,证明了Transformer架构不仅在处理序列数据(如文本)方面非常有效,在处理图像数据时也能取得卓越性能。

 3. Vision Transformer的核心思想是将输入的图像视为一个序列化的输入,通过自注意力机制来处理图像中的像素关系。具体而言,ViT首先将输入图像划分为多个固定大小的图像块(Patches),然后对每个图像块进行线性映射(Flattening + Linear Projection),将其转换成一个向量。这些向量连同一个特殊的分类Token一起作为Transformer的输入序列。这样,图像就被转换成了一个序列数据,从而可以直接应用自注意力机制进行特征提取。

二、模型结构

2.1 整体架构

 ViT模型如下架构图所示,其中主要有三个部分组成:(1) Linear Projection of Flattened Patches(Embedding层,将子图映射为向量);(2) Transformer Encoder(编码层,对输入的信息进行计算学习);(3) MLP Head(用于分类的层结构)。

在这里插入图片描述

在这里插入图片描述

2.2 Linear Projection of Flattened Patches

 1. Linear Projection of Flattened Patches(平铺块的线性投影)是ViT模型架构中的一个重要组成部分。这个过程主要涉及到将输入的图像数据转换为Transformer模型能够处理的一维向量序列。

 2. 作用与目的:
 (1)图像数据转换:由于标准的Transformer模型接收的是一维的嵌入序列,而图像数据是三维的(高度H、宽度W、通道数C),因此需要通过线性投影将图像数据转换为Transformer能够处理的格式。
 (2)信息提取:通过平铺和线性投影,图像被划分为多个小块(Patches),每个小块被转换为一个一维向量,这些向量包含了图像中的局部信息。

 3. 具体步骤:
 (1)图像划分:将输入图像按照预定的尺寸(如16x16)划分为多个小块(Patches)。以ViT-B/16为例,如果输入图像的大小为224x224,则会被划分为(224/16)x(224/16)=196个小块。

 (2)平铺操作:将每个小块展平(Flatten)为一维向量。

 (3)线性投影:使用一个线性层(通常是卷积层)将每个展平后的小块映射到一个更高维的向量空间中。这个线性层的作用是将每个小块的特征进行抽象和整合,以便后续的自注意力机制能够处理。以ViT-B/16为例,线性投影层通常使用一个卷积核大小为16x16、步距为16、卷积核个数为768的卷积来实现。这个卷积操作会生成一个形状为[14, 14, 768]的特征图(由于步距为16,所以高度和宽度都减少了),然后将其展平为[196, 768]的形状,即196个长度为768的向量(后面都直接称为token)。

在这里插入图片描述

 (4)添加特殊Token和位置编码:在所有向量序列的开头添加一个特殊的class Token(分类Token),用于后续的图像分类任务。这个Token是一个可训练的参数,与其他向量具有相同的维度。给每个向量添加一个位置编码(Position Embedding),以保留它们在图像中的位置信息。位置编码通常是可学习的,并且与向量的维度相同。

 4. 图像分块代码块:

class PatchEmbed(nn.Module):
    def __init__(self, input_shape = [224,224], patch_size = 16, in_channels = 3, num_features = 768, norm_layer = None, flatten = True):
        super().__init__()
        # num_patch就是可以划分多少个图像块,14*14的patch = 196
        self.num_patch = (input_shape[0] // patch_size) * (input_shape[1] // patch_size) 
        self.flatten = flatten
 
        self.proj = nn.Conv2d(in_channels, num_features, kernel_size=patch_size, stride=patch_size)
        self.norm = norm_layer(num_features) if norm_layer else nn.Identity()
 
    def forward(self, x):
        # proj就是对输入图像进行卷积分块
        x = self.proj(x) 
        if self.flatten:
            x = x.flatten(2).transpose(1, 2)
        x = self.norm(x)
        return x

 每个图像块都是经过一次特征提取的,可以对其中的一个图像块可视化一下看看:

在这里插入图片描述

# class token的定义
self.cls_token      = nn.Parameter(torch.zeros(1, 1, num_features))
# position embedding定义
self.pos_embed = nn.Parameter(torch.zeros(1, num_patches + 1, num_features))

在这里插入图片描述

在这里插入图片描述

2.3 Transformer Encoder

Transformer Encoder是属于Transformer中的内容,具体请看:深度学习(6)—Transformer

 Encoder结构如下图所示,左侧为实际结构,右侧为论文中结构,省去了Dropout/DropPath层。
在这里插入图片描述

 MLP Block结构如下图所示,由全连接+激活函数+Dropout组成:

在这里插入图片描述

 经过多层Transformer Encoder处理后,最开始添加的分类Token的特征向量被提取出来,该向量包含了关于整个图像的综合信息。
 在Vision Transformer中,通常会在Transformer编码器的输出之后添加一个多层感知机(MLP)用于最终的任务输出,如在图像分类任务中预测类别。

2.4 MLP Head

 1. 在经过Transformer Encoder时,输入的shape和输出的shape保持不变。在论文中,以ViT-B/16为例,输入的是[197, 768]输出的还是[197, 768]。在Transformer Encoder后还有一个Layer Norm,结构图中并没有给出,如下图所示:
在这里插入图片描述

 2. MLP Head通过一系列的全连接层(Fully Connected Layers)和激活函数来将Transformer Encoder输出的表示向量进一步处理,以生成对应于不同类别的概率分布。

 3. 这里我们只是需要Transformer Encoder中的分类信息,所以我们只需要提取出class token生成的对应结果就行,即[197, 768]中抽取出class token对应的[1, 768],因为self-attention计算全局信息的特征,这个class token其中已经融合了其他token的信息。接着我们通过MLP Head得到我们最终的分类结果。

三、ViT模型搭建参数

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

在这里插入图片描述

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

ModelPatch SizeLayersHidden Size DMLP sizeHeadsParams
ViT-Base16x161276830721286M
ViT-Large16x16241024409616307M
ViT-Huge14x14321280512016632M

四、思考题

 为什么Vision Transformer比CNN效果好?
 (1)Vision Transformer采用了Transformer架构中的自注意力机制,这种机制能够捕获图像中任意两个像素或图像块之间的依赖关系,而不仅仅是局部信息。相比之下,CNN虽然能够提取局部特征,但在处理全局依赖关系时可能存在局限。
 (2)ViT通过将图像分割成一系列小块(patches)并作为序列处理,使得每个patch在模型中的表示都能够考虑到整个图像的信息,从而具有全局感受野。而CNN的感受野大小受限于卷积核的大小和网络的深度。

### 回答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模型必将成为图像处理领域的重要一员。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

冒冒菜菜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值