ViT: An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

本文探讨了VisionTransformer(ViT)如何直接应用于图像分类任务。通过在大量数据上预训练,然后迁移至较小的数据集进行测试,ViT展现出优异的表现,并减少了计算需求。文章详细介绍了ViT的模型架构,包括Patch Embedding、位置嵌入及Transformer编码器等关键组成部分。

Vision Transformer

以下内容是对原文章些许解读:
论文地址:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
代码: https://github.com/google-research/vision_transformer

文章贡献:探索将Transformer直接应用于图像分类任务,首先在大量数据上进行预训练随后将其迁移到多个中型和小型基准上进行测试,Vision Transformer取得了出色的结果,并且需要的计算资源大大减少。

方法:

模型的设计尽可能的遵循原始Transformer,这种有意简化设置的优点有: NLP Transformer结构具备良好扩展性、高效实现、几乎可以开箱即用。

1.模型架构:

模型结构图
将图像分割成固定大小的图像块,线性嵌入每个块,添加位置嵌入,然后将产生的向量序列输入到标准的Transformer编码器。为了执行分类,使用标准的方法向向量序列添加一个额外的可学习的分类标签。

  • Patch Embedding: 标准的Transformer接收符号嵌入的1D序列作为输入。为了处理2D的图像,我们将图像 x p ∈ R H × W × C x_{p}\in \mathbb{R}^{H\times W\times C} xpRH×W×C重塑为拉平的2D图像块序列 x p ∈ R N × ( P 2 ⋅ C ) x_{p}\in \mathbb{R}^{N\times \left ( P^{2} \cdot C\right )} xpRN×(P2C),其中 ( H , W ) (H,W) (H,W)是原始图像的分辨率, C C C是通道的数量, ( P , P ) (P,P) (P,P)是每个图像块的分辨率, N = H W P 2 N=\frac{HW}{P^{2}} N=P2HW是图像块的数量,也是Transformer有效输入序列的长度。Transformer在其所有层中使用大小为D的恒定向量,所以将patches拉平并使用一个可训练的线性投影层将其映射到D维。(使用公式1)将该投影层的输出作为patch embeddings。
  • Learnable Embedding: 与BERT的标记类似,我们在图像块嵌入序列前添加一个可学习的嵌入 ( z 0 0 = x c l a s s ) (z_0^0=x_class) (z00=xclass),其在Transformer编码器输出 ( z L 0 ) (z_L^0) (zL0)处的状态作为图像表示 y y y(公式4)。在预训练和微调期间,分类头被附加到 z L 0 z_L^0 zL0。分类头在预训练时由一个隐层的MLP实现,在微调时由单个线性层实现。
  • Position Embedding:
    位置嵌入被添加到图像块嵌入中以保留位置信息。由于我们没有观察到使用更先进的2D感知位置嵌入能带来显著的性能提升,因此我们使用标准可学习的1D位置嵌入。所得到的嵌入向量序列作为编码器的输入。
  • Transformer Encoder:
    由交替的多头自注意力块和MLP块组成。每个块之前应用Layernorm(LN),每个块之后应用残差连接。MLP包含两层和一个GELU非线性激活。

模型公式

归纳偏置:注意到Vision Transformer比CNN拥有更少的特定于图像的归纳偏置。在CNN中局部性、二维邻域结构和平移不变性贯穿整个模型的每一层。在ViT中,只有MLP是局部的、平移不变的,而自注意层时全局的。二维邻域结构使用的非常少,在模型开始时将图像分割成小块,在微调时调整不同分辨率的图像的位置嵌入。除此之外,初始化的位置嵌入不包含任何的位置信息,所有图像块之间的空间信息需要从头学习。
混合模型:将从CNN特征图中提取的patches作为patch embedding投影层的输入。

2.微调和更高的分辨率:

通常我们在大型数据集上进行预训练ViT,并对下游任务进行微调。为此,我们去掉预训练的预测头并附加一个零初始化的D×K的前馈层,K是下游类别的数量。它通常有利于在比预训练更高的分辨率下进行微调。当输入较高分辨率图像时,我们保持图像块大小不变,从而得到更大的有效序列长度。Vision Transformer能够处理任意序列长度(直到内存限制),但是预训练的位置编码可能不再有意义。因此根据他们在原始图像中的位置,我们对预训练的position embedding执行了2D插值。注意分辨率调整和图像块提取是手动将图像二维结构的归纳偏置注入到Vision Transformer中的唯一一点。

论文《An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale》由谷歌团队发表于ICLR 2021,主要介绍了Vision Transformer (ViT) 的设计与性能。以下是关于该论文的一些重要引用: ### 关键概念概述 - **图像分割为Patch序列**:为了使Transformer能够处理图像数据,论文提出将图像划分为固定大小的块(patches)。这些块被线性映射为向量,并附加位置编码以保留空间信息[^2]。 - **减少归纳偏差**:相比于传统卷积神经网络(CNN),ViT通过直接处理图像patch序列的方式显著减少了图像特定的归纳偏差。这意味着模型更加灵活,能够在不同类型的图像任务中表现出更强的泛化能力[^3]。 - **预训练的重要性**:研究发现,在大规模数据集上进行预训练对于提升ViT的表现至关重要。即使是在较小的数据集上微调时,经过充分预训练的ViT也能达到甚至超过现有最佳卷积网络的效果[^4]。 - **计算效率高**:尽管Transformer架构通常被认为计算成本较高,但实验表明,当应用于适当规模的任务时,ViT所需的计算资源实际上低于许多先进的CNN模型。 ### 技术细节说明 下面是一段简单的Python代码实现如何将一张图片转换成适合输入给ViT模型的形式: ```python import numpy as np def split_image_into_patches(image, patch_size=16): height, width, channels = image.shape patches = [] for y in range(0, height, patch_size): for x in range(0, width, patch_size): patch = image[y:y+patch_size, x:x+patch_size] if patch.shape[:2] == (patch_size, patch_size): # Ensure full-sized patches only. patches.append(patch.flatten()) return np.array(patches) # Example usage with a dummy RGB image of size 224x224 pixels and 3 color channels. dummy_image = np.random.rand(224, 224, 3) image_patches = split_image_into_patches(dummy_image) print(f"Number of Patches Generated: {len(image_patches)}") ``` 此函数会把任意尺寸的RGB图像切割成一系列形状相同的补丁,准备作为后续嵌入层的输入源材料之一。 --- ####
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值