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

摘要

在这篇文章中,作者主要拿ResNet、ViT(纯Transformer模型)以及Hybrid(卷积和Transformer混合模型)三个模型进行比较。

Vision Transformer

在这里插入图片描述

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

Embedding层

在这里插入图片描述

Transformer Encoder层

在这里插入图片描述在这里插入图片描述

MLP Head层

在这里插入图片描述

Vision Transformer网络结构

以ViT-B/16为例
在这里插入图片描述

Hybrid模型

在这里插入图片描述下表是论文用来对比ViT,Resnet(和刚刚讲的一样,使用的卷积层和Norm层都进行了修改)以及Hybrid模型的效果。通过对比发现,在训练epoch较少时Hybrid优于ViT,但当epoch增大后ViT优于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数。
在这里插入图片描述

参考大佬:https://blog.youkuaiyun.com/qq_37541097/article/details/118242600

### Vision Transformer 架构详解 Vision Transformer (ViT) 是一种基于纯变换器架构的视觉模型,最初由 Google 团队于 2020 年提出。该模型旨在处理图像数据并执行分类任务,通过将图像分割成多个小块来模仿自然语言处理中的词元化操作[^2]。 #### 图像分片与线性嵌入 输入图像被均匀划分为固定大小的小图块(patches),这些图块随后会被展平为一维向量,并经过线性映射转换为具有相同维度的特征向量。为了保留位置信息,在此阶段还会加入可训练的位置编码[^1]。 ```python class PatchEmbedding(nn.Module): def __init__(self, img_size=224, patch_size=16, embed_dim=768): super().__init__() self.proj = nn.Conv2d(3, embed_dim, kernel_size=patch_size, stride=patch_size) def forward(self, x): x = self.proj(x).flatten(2).transpose(1, 2) return x ``` #### 变换器编码层堆叠 得到的一系列带有位置信息的特征向量作为输入传递给一系列相同的变换器编码单元组成的网络。每个编码单元内部包含了多头自注意机制以及前馈神经网络两大部分,二者之间采用残差连接和标准化技术以促进梯度传播[^3]。 ```python class Block(nn.Module): """Transformer block.""" def __init__(self, dim, num_heads, mlp_ratio=4., qkv_bias=False, drop_path_rate=0.): super().__init__() self.norm1 = nn.LayerNorm(dim) self.attn = Attention( dim, num_heads=num_heads, qkv_bias=qkv_bias, ) # ...其余代码省略... ``` #### 类标记与全局平均池化 在序列最前端添加一个特殊的类别令牌([CLS] token),用于收集整个图片的信息摘要。最终输出时仅需对该令牌对应的隐藏状态做进一步处理即可获得预测结果。此外,还可以选择使用全局平均池化代替类标记来进行表征聚合。 ```python class VisionTransformer(nn.Module): def __init__(self, ..., classifier='token'): ... if classifier == 'token': self.cls_token = nn.Parameter(torch.zeros(1, 1, config.hidden_size)) elif classifier == 'gap': self.has_cls_token = False def forward_features(self, x): B = x.shape[0] x = self.patch_embed(x) cls_tokens = self.cls_token.expand(B, -1, -1) x = torch.cat((cls_tokens, x), dim=1) x = self.pos_drop(x + self.pos_embed) x = self.blocks(x) x = self.norm(x) if self.classifier == "token": x = x[:, 0] else: x = x.mean(dim=1) return x ``` ### 应用场景 除了经典的图像分类外,ViT 还可以应用于其他多种计算机视觉任务中,比如目标检测、语义分割等。由于其强大的表达能力和灵活性,使得 ViT 成为了当前热门的研究方向之一[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值