什么是VIT?

本文探讨了Transformer在视觉领域的应用挑战,包括如何将2D图像转换为1D序列以及如何降低复杂度。介绍了VIT(Vision Transformer)通过切分patch和使用位置编码的方法来处理图像。在前向过程中,VIT将图像切割成patch,经过多层TransformerBlock进行处理。消融实验表明,不同位置编码方式和模型结构对结果影响不大。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VIT就是Vision Transformer。

目录

1.Transformer在视觉领域上使用的难点:

2.输入序列长度的改进

3.VIT对输入的改进


1.Transformer在视觉领域上使用的难点

在nlp中,输入transformer中的是一个序列,而在视觉领域,需要考虑如何将一个2d图片转化为一个1d的序列,最直观的想法就是将图片中的像素点输入到transformer中,但是这样会有一个问题,因为模型训练中图片的大小是224*224=50176,而正常的bert的序列长度是512,是bert的100倍,这个的复杂度太高了。

2.输入序列长度的改进

如果直接输入像素点复杂度太高的话,就想着如何降低这部分的复杂度

1)使用网络中间的特征图

比如用res50最后一个stage res4 的feature map size只有14*14=196,序列长度是满足预期的

2)孤立自注意力

使用local window而不是整张图,输入的序列长度可以由windows size来控制

3)轴自注意力

将在2d图片上的自注意力操作改为分别在图片的高和宽两个维度上做self-attention,可以大大降低复杂度,但是由于目前硬件没有对这种操作做加速,很难支持大规模的数据量级。

3.VIT对输入的改进

先将图片切分成一个个patch,然后每一个patch作为一个token输入到transformer中,但是由于整个transformer每个token之间都会做attention,所以输入本身并不存在一个顺序问题。但是对于图片而言,每个patch之间是有顺序的,所以类比bert,给每个patch embedding加上一个position embedding(是sum)。同时最终的输出也借鉴了bert, 用0和cls来替代整体,这部分对应的embedding就是最终的输出。

4.前向过程:

首先VIT中将224*224的图片切分成了一个个16*16的patch,最终切分出了196个patch,每个patch的大小是16*16*3=768(3是RGB通道个数),同时每个输入都要加上cls,所以整个embedding的输入是197*768。经过layer norm之后,得到的维度不变。经过多头注意力时,如果使用的是base版本的12头自注意力,那么每个头的k,q,v对应的维度将变为768/12=64,最后将12个头的embedding再拼接到一起,就是64*12=768,然后再经过一个layer norm,最后通过一个MLP,这里一般会将维度放大四倍,197*3012,然后再投射回去,变成197*768。

这里显示的是一个transformer block,可以往上不断的叠加,L层这样的block叠加到一起就是最终的transformer encoder。

5.消融实验

1.cls和GAP(global average pooling,其他视觉任务中的基本操作)结果差不多

2.位置编码:1d,2d,相对位置编码的结果也差不多

2d编码:分别用D/2的向量去描述横纵坐标

相对位置编码:两者之间差了几个单位距离

3.归纳偏置:较少的使用到了2d位置信息

4.混合模型:不使用投影而是直接使用CNN得到16*16的patch

5.微调:当图像块大小变大时,效果理论上会变好,但是位置信息变得不可用起来,因为大图片和小图片被切分成了不同的块数,位置信息变得无效。这里做了个简单的2d差值。

### Vision Transformer (ViT) 是否为生成模型 Vision Transformer (ViT) 并不属于典型的生成模型[^1]。它的主要设计目标是解决图像分类和其他监督学习任务,而不是生成新的数据样本。具体来说,ViT 使用 Transformer 架构通过自注意力机制捕获图像中的全局依赖关系,并将其应用于图像分类等任务。这种架构的核心在于提取特征并映射到特定的任务输出(例如类别标签),而非生成新图像。 #### ViT 与生成模型的区别 以下是 ViT 和生成模型之间的几个关键区别: 1. **任务目标** - ViT 主要专注于判别任务,例如图像分类、对象检测和语义分割。这些任务的目标是从给定的数据集中推断出正确的标签或描述[^2]。 - 生成模型则旨在创建类似于训练集的新数据样本。常见的生成模型包括变分自动编码器(VAE)、生成对抗网络(GAN)以及其他扩散模型。 2. **架构差异** - ViT 基于 Transformer 结构,将图像划分为固定大小的 patches,并通过位置嵌入和自注意力机制处理这些 patches 的序列化表示。 - 生成模型通常采用不同的架构,例如 GAN 中的生成器和判别器结构,或者 VAE 中的编码器-解码器框架。这些模型的设计重点在于重建输入数据或生成全新的样例。 3. **损失函数** - ViT 的训练过程依赖交叉熵损失或其他适合分类任务的损失函数,目的是优化预测类别的准确性[^2]。 - 生成模型使用的损失函数更加多样化,可能涉及重构误差(如均方误差)、对抗损失(如 GAN 的判别器损失)或 KL 散度(如 VAE 的正则项)。 4. **应用场景** - ViT 更适用于需要精确分类或理解图像内容的任务,例如医学影像分析、自动驾驶场景识别等。 - 生成模型广泛应用于艺术创作、数据增强、超分辨率重建等领域,能够创造逼真的图像或视频内容。 尽管如此,在某些情况下,可以将 ViT 或类似的 Transformer 模型扩展至生成任务。例如,DALL·E 就是一个结合了语言理解和图像生成能力的多模态 Transformer 模型,但它已经超越了传统 ViT 的范畴[^3]。 ```python # 示例代码展示如何加载预训练的 ViT 模型进行分类任务 from transformers import ViTFeatureExtractor, ViTForImageClassification import requests from PIL import Image import torch url = "https://example.com/sample_image.jpg" image = Image.open(requests.get(url, stream=True).raw) feature_extractor = ViTFeatureExtractor.from_pretrained('google/vit-base-patch16-224') model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224') inputs = feature_extractor(images=image, return_tensors="pt") outputs = model(**inputs) logits = outputs.logits predicted_class_idx = logits.argmax(-1).item() print(f"Predicted class: {model.config.id2label[predicted_class_idx]}") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值