论文解读:VIT探索笔记 (AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE)

VIT探索笔记

切入点

如何把一张图变成一句话? 对输入图做切割,分块,每一块就是一个token(单词);
假设一张224x224x3的图,分块,也就是论文中的patch, 每块大小为16x16x3,那就得到196块,这样就把一个CV问题变成了NLP问题。

有了patch的想法,再加上原汁原味的Transformer, 开始大力出奇迹,特别强调,作者是保持原汁原味的Transformer,然后在其他方向上做消融实验(大力出奇迹),比如位置编码,分块大小等

没办法从感性上去思考他是怎么working的? patch之间做Self-Attention,怎么就Nice了呢!!!!!

值得一提的相关研究,2020年Cordonnier提出一种方式,从输入图片取出2 x 2大小的patch并采用full self-attention,这与本篇采用的方式最为接近,但本篇进一步证明了使用大量训练数据训练的Transformer就比CNN SOTA具有更高的性能。论文地址:On the Relationship between Self-Attention and Convolutional Layers

内容点

  • 和Transformer一样,没有任何卷积操作
  • (ViT-H/14),(ViT-L/16), 数字14和16是patch size

网络结构

第一,九宫格-输入层

在这里插入图片描述

  • 输入图片X: 224x224x3,
  • patch大小设置为16x16x3,看结构图,九宫格的每一个格子是的大小16x16,维度是3,一个格子就是一个patch。
  • 一张224x224的图有多少个patch呢?,也就是对应的NLP里面的token = (224x224) / (16x16) = 196个,相当于一张图转变一个196个token的句子,看上图,把九宫格拉直,就是个句子。

需要注意的是,假设输入图片X的size改变了,但是patch的size是保持不变的(16x16);从上面的分析,可以知道,输入图片X的size变大后(224x224==》256x256),那我们将得到256个patch。 由此,就带来一个问题,positional embedding(位置编码)信息对不上了,论文中给出的方法是插值法或者重新训练。

第二,Patch Embedding | Linear Projection of Flattened Patches | 线性全连接层

在这里插入图片描述

  • 这一层的任务也叫做:Patch Embedding
  • 线性的全连接层,输入是768xD,D为设置为768(也可以根据数据大小调参,大数据集可以调整为1024),
    XE = 196 x (1616*3) x 768 x 768 = 196x768
  • X经过全连接层后,得到196x768的向量,即X*E的输出为196x768

第三,Position Embedding(位置编码) 和 [class] embedding

在这里插入图片描述

  • 位置编码有1D,2D等方式,作者在论文中做了消融实验,1D就足够好了,1D类似于对九宫格做1,2,3,4,5,6,7,8,9的位置编码;
  • 打乱patch的位置,并不会改变结果,self-attention的特性
  • 位置编码大小为196x768,
  • X*E的输出(196x768),和 位置编码相加,得到 196x768,向量维度大小不变
  • 最后,在加上一个维度,就是class标签的维度,class enbeding的大小为 1x768, cat(class enbeding, 位置编码+X*E)==》197x768, 197x768 也是Transformer Encoder的输入。
# 这里多1是class token,embed_dim即patch embed_dim
self.pos_embed = nn.Parameter(torch.zeros(1, num_patches + 1, embed_dim)) 

# patch emded + pos_embed
x = x + self.pos_embed

第四,Transformer Encoder
在这里插入图片描述

  • 作者保留了原汁原味的Transformer Encoder,
  • 输入197x768,输出197x768
  • 叠加L个

完整网络结构图
在这里插入图片描述

在这里插入图片描述

交流群

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/283e2cf1d2bd474da10cda7dce21c879.jpeg

在这里插入图片描述

<think>好的,用户想了解关于Vision Transformer(ViT)的学习资料和笔记。首先,我需要整理ViT的基础知识,确保覆盖其核心结构和关键概念。根据提供的引用,ViT将Transformer架构应用于计算机视觉,特别是图像分类任务。需要提到编码器、解码器部分,不过根据引用[1],ViT主要基于Transformer的编码器结构,这可能与原始Transformer不同。 接下来,用户可能需要学习资料,包括论文、GitHub代码库和教程。引用[2]提到了Google Research的GitHub仓库,应该推荐这个。另外,用户可能对ViT的工作原理感兴趣,比如如何处理图像数据。传统CNN会先提取特征图,ViT则通过分块(patches)将图像转换为序列,如引用[3]所述。需要解释分词器的作用,将图像分块并线性嵌入成标记序列,然后输入Transformer编码器。 还要注意比较ViT与CNN的差异,强调自注意力机制的优势。可能的问题包括ViT的计算效率、训练数据需求,以及应用场景。用户可能想知道如何实现ViT,所以需要提供代码示例或库的链接。此外,引用中的资料可以作为主要参考文献,确保引用标识正确。 最后,生成相关问题时,要考虑用户可能的后续疑问,比如ViT的优化方法、与CNN的结合,或者在不同任务中的应用。需要确保回答结构清晰,分点说明,并推荐可靠资源,帮助用户深入学习。</think>### Vision Transformer (ViT) 学习笔记 #### 1. **核心思想** Vision Transformer (ViT) 将Transformer架构应用于图像分类任务,通过将图像分割为固定大小的块(patches),并将这些块线性嵌入为序列输入Transformer编码器[^1][^3]。与传统CNN不同,ViT直接利用自注意力机制捕捉全局依赖关系。 #### 2. **关键步骤** - **图像分块**:将输入图像 $x \in \mathbb{R}^{H \times W \times C}$ 划分为 $N$ 个块,每个块大小为 $P \times P$,得到 $N = \frac{HW}{P^2}$ 个块。 - **线性嵌入**:将每个块展平为向量 $x_p \in \mathbb{R}^{P^2C}$,并通过可学习的线性层映射为 $D$ 维向量。 - **位置编码**:添加可学习的位置嵌入(position embedding)以保留空间信息: $$ z_0 = [x_{\text{class}}; x_p^1E; x_p^2E; \dots; x_p^NE] + E_{\text{pos}} $$ 其中 $E \in \mathbb{R}^{(P^2C) \times D}$ 为嵌入矩阵,$E_{\text{pos}}$ 为位置编码。 - **Transformer编码器**:由多头自注意力(MSA)和前馈网络(FFN)交替组成,公式为: $$ z'_l = \text{MSA}(\text{LayerNorm}(z_{l-1})) + z_{l-1} $$ $$ z_l = \text{FFN}(\text{LayerNorm}(z'_l)) + z'_l $$ 最终输出用于分类[^1][^2]。 #### 3. **与CNN的对比** - **优势**:ViT通过自注意力捕获长距离依赖,无需局部卷积归纳偏置,适合大规模数据场景。 - **局限**:小规模数据训练效果可能不如CNN,需大量预训练数据(如JFT-300M)。 #### 4. **学习资料推荐** - **论文**:[*An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale*](https://arxiv.org/abs/2010.11929) - **代码实现**:Google Research官方GitHub仓库 [vision_transformer](https://github.com/google-research/vision_transformer) - **教程**: - [PyTorch实现ViT](https://pytorch.org/vision/stable/models/vision_transformer.html) - 李宏毅《深度学习》课程中Transformer与ViT章节 #### 5. **代码示例(简化版)** ```python import torch from torchvision.models import vision_transformer # 加载预训练ViT模型 model = vision_transformer.vit_b_16(pretrained=True) # 输入图像分块处理 x = torch.randn(1, 3, 224, 224) # 输入尺寸需为224x224 output = model(x) # 输出分类结果 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

且漫CN

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

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

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

打赏作者

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

抵扣说明:

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

余额充值