Vision Transformer

原始文章:
Vision Transformer 超详细解读 (原理分析+代码解读) (一)

1. 一切从Self-attention开始

解决问题: 如何处理序列化Sequence数据,并让网络有全局的视野,一般使用RNN处理,但是RNN不能并行运算,CNN视野又不够,因此self-attention由此诞生!

self-attention原理:
self-attention核心的三个参数q,k,v的含义:
在这里插入图片描述

d是 q和k 的维度。因为 q·k的数值会随着dimension的增大而增大,所以要除以 根号d的值,相当于归一化的效果
在这里插入图片描述
把计算得到的所有a的值取softmax操作在这里插入图片描述
在这里插入图片描述
Multi-head Self-attention:
以两头self-attention为例,其实就是多计算一套qkv参数,然后对最终结果concat传入linear层:
在这里插入图片描述
在这里插入图片描述
Positional Encoding
以上是self-attention的原理,但是还有一个问题是:现在的self-attention中没有位置的信息,一个单词向量的“近在咫尺”位置的单词向量和“远在天涯”位置的单词向量效果是一样的,没有表示位置的信息(No position information in self attention)。所以你输入"A打了B"或者"B打了A"的效果其实是一样的,因为并没有考虑位置的信息,为了解决这个问题,作者在网络中插入Positional Encoding信息:
在这里插入图片描述
这里作者对位置信息才用add操作而不是concat操作,原因如下:
在这里插入图片描述

2 Transformer的实现和代码解读

Transformer原理分析
在这里插入图片描述
encode部分较简单,decode部分有关masked multihead attention,原因是训练时要把还没预测出的信息给mask掉:
在这里插入图片描述
第1个Masked Multi-Head Self-attention的q,k,v均来自Output Embedding。
第2个Multi-Head Self-attention的q来自第1个Self-attention layer的输出, k,v来自Encoder的输出。
为什么这么设计?这里提供一种个人的理解:
k,v来自Transformer Encoder的输出,所以可以看做句子(Sequence)/图片(image)的内容信息(content,比如句意是:“我有一只猫”,图片内容是:“有几辆车,几个人等等”)。
q表达了一种诉求:希望得到什么,可以看做引导信息(guide)。
通过Multi-Head Self-attention结合在一起的过程就相当于是把我们需要的内容信息指导表达出来。

各种Normalization方法比较:
在这里插入图片描述

Transformer+Detection:引入视觉领域的首创DETR

文章的主要有两个关键的部分。
第一个是用transformer的encoder-decoder架构一次性生成N个box prediction。其中
N是一个事先设定的、比远远大于image中object个数的一个整数。
第二个是设计了bipartite matching loss,基于预测的boxex和ground truth boxes的二分图匹配计算loss的大小,从而使得预测的box的位置和类别更接近于ground truth。
在这里插入图片描述
原版Transformer只考虑 x方向的位置编码,但是DETR考虑了
x,y方向的位置编码,因为图像特征是2-D特征。采用的依然是 sin-cos模式,但是需要考虑 x,y两个方向。不是类似vision transoformer做法简单的将其拉伸为 d*HW ,然后从 [1,HW]进行长度为256的位置编码,而是考虑了 x,y方向同时编码,每个方向各编码128维向量,这种编码方式更符合图像特点。
在这里插入图片描述
总结下和原始transformer编码器不同的地方:

  1. 输入编码器的位置编码需要考虑2-D空间位置。
  2. 位置编码向量需要加入到每个Encoder Layer中。
  3. 在编码器内部位置编码Positional Encoding仅仅作用于Query和Key,即只与Query和Key相加,Value不做任何处理。
    在这里插入图片描述
  • 27
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值