Vision Transformer

1.前言

2.Vision Transformer算法流程

在这里插入图片描述

  • 将图像分为一个个的patch,然后将九个patch输入至Linear Projection of Flattened Patches(Embedding层)
  • 之后每个patch会得到对应的一个个向量(token),同时会在9个token前面加上class token(参考的BERT网络)上图的粉色椭圆形对应的区域
  • 再给每一个token加上位置信息(Position Embedding),对应到上图紫色的椭圆形0-9这些数字所标注的
  • 然后将token和Position Embedding输入到Transformer Encoder(具体内容是上图右侧所示)
  • 我们这里需要对图像进行分类,所以只需要提取class token所对应的输出,再通过MLP head得到最终的分类结果

2.1Linear层

  • 对于标准的Transformer模块,要求输入的是token(向量)序列,即二维码矩阵[num_token,token_dim]
    在这里插入图片描述

  • 在图像分层patches再输入至Linear Projection of Flattened Patches(Embedding层)时,在代码实现中,是直接通过一个卷积层来实现以ViT-B/16为例(其中16就是patch的大小),使用卷积核大小为16×16,步距stride为16,卷积核个数为768,这里768对应每个token向量的长度/维度(16×16×3)

  • 所以通过卷积层之后就将[224,224,3]变成了[14,14,768](226÷14=16),再将高度和宽度两个信息展平变成[196×768](14×14=196),196个token

  • 在输入Transformer Encoder之前需要加上[class]token以及Position Embedding,都是可训练参数

  • 初始化了拼接参数[class]token:Cat([1,768],[196,768])->[197,768](Cat是1×1大小的,维度是768,再乘上上面计算patch的[196,768]最终得到的为[197,768])

  • 叠加位置编码Position Embedding:[197,768]->[197,768]

2.2Position Embedding

在这里插入图片描述

  • 比如第一行第一列所对应的位置编码,首先与它自己进行余弦相似度的求解=1,所以就是黄色
  • 通过对照右侧的数值表,可以知道值是在-1到1之间,颜色是从暗到亮的
  • 通过上图可以观察到,该方块所对应的行和列都是比较亮的,比如最后一行最后一列的就是比较亮,偏黄的

2.3Transformer Encoder层

在这里插入图片描述

  • 这部分与Transformer类似,这里就不再赘述了
  • 注意,在Transformer Encoder前面有个Dropout层,后有一个Layer Norm层(原论文中没有绘制出来,但是看代码是有的)

2.4MLP Head层

  • 注意,在Transformer Encoder前面有个Dropout层,后有一个Layer Norm层(原论文中没有绘制出来,但是看代码是有的)
  • 训练ImageNet21K时,是由全连接层(Linear)+激活函数(tanh)+全连接层(Linear)
  • 但是迁移到ImageNet1K上或者自己数据上时,就只有一个简单的全连接层(Linear),就可以将MLP Head简单理解为一个全连接层,后面如果需要得到每个类别概率,还需要再接上一个 s o f t m a x softmax softmax
    在这里插入图片描述
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vision Transformer(ViT)是一种基于Transformer架构的深度学习模型,用于处理计算机视觉任务。它将图像分割成一系列的图像块,并将每个图像块作为输入序列传递给Transformer编码器。每个图像块通过一个线性投影层转换为向量表示,并与位置嵌入向量相结合,然后输入到Transformer编码器中进行处理。Transformer编码器由多个自注意力层和前馈神经网络层组成,用于学习图像中的全局和局部特征。最后,通过一个线性分类器对编码器的输出进行分类。 Vision Transformer的优点是能够在没有使用传统卷积神经网络的情况下,实现对图像的高质量特征提取和分类。它在一些计算机视觉任务上取得了与传统方法相媲美甚至更好的性能,例如图像分类、目标检测和语义分割等任务。 以下是一个使用Vision Transformer进行图像分类的示例代码[^1]: ```python import torch import torch.nn as nn from torchvision import transforms from torchvision.models import resnet50 from vit_pytorch import ViT # 加载预训练的Vision Transformer模型 model = ViT( image_size = 224, patch_size = 16, num_classes = 1000, dim = 768, depth = 12, heads = 12, mlp_dim = 3072, dropout = 0.1, emb_dropout = 0.1 ) # 加载预训练的权重 model.load_from('vit_weights.pth') # 图像预处理 transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 加载图像并进行预处理 image = Image.open('image.jpg') image = transform(image).unsqueeze(0) # 使用Vision Transformer进行图像分类 output = model(image) _, predicted_class = torch.max(output, 1) # 输出预测结果 print('Predicted class:', predicted_class.item()) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

没有难学的知识

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

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

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

打赏作者

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

抵扣说明:

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

余额充值