Vision Transformer

在之前的笔记Transformer模型基础中,介绍了Transformer模型的结构。 Transfermer模型被设计用于自然语言处理,但是后来因其强大的特征捕捉能力被逐渐应用到图像处理中。在图像处理应用中,可以把一个图片分割成一个个的patch,比如 48 × 48 48\times 48 48×48的图像可以进一步划分为9个 16 × 16 16 \times 16 16×16的patch。这样,每一个patch都可以被看作一个“word”或者是一个"token"。 把每个patch在原图中的位置看为位置编码器,我们就可以应用Transformer模型处理图像数据。

Vision Transformer

图像预处理

Vision Transformer会把图像转换为一个序列,序列中的每个元素都是一个小的patch。比如,一个 N × N N \times N N×N大小的图像,需要将其划分为 ( N / M ) 2 (N/M)^2 (N/M)2 个大小为 M × M M \times M M×M的patch。

def img_to_patch(x, patch_size, flatten_channels=True):
    """
    Inputs:
        x - torch.Tensor representing the image of shape [B, C, H, W]
        patch_size - Number of pixels per dimension of the patches (integer)
        flatten_channels - If True, the patches will be returned in a flattened format
                           as a feature vector instead of a image grid.
    """
    B, C, H, W = x.shape
    x = x.reshape(B, C, H//patch_size, patch_size, W//patch_size, patch_size)
    x = x.permute(0, 2, 4, 1, 3, 5) # [B, H', W', C, p_H, p_W]
    x = x.flatten(1,2)              # [B, H'*W', C, p_H, p_W]
    if flatten_channels:
        x = x.flatten(2,4)          # [B, H'*W', C*p_H*p_W]
    return x

所以,我们可以得到下面的patch序列。
在这里插入图片描述

Transformer针对图像处理的architecture改进

在这里插入图片描述
在使用Vision Transformer时,相比于处理文本的transformer模型在结构上做了一点改进。如上图,在residual blocks之前后者之后增加了一个Layer Normalization。如果只是使用ViT的话,不需要对其结构做太多研究,只需要沿用其他人验证过的即可。

除此之外, 在Vision Transformer中,还需要一些额外的layer使其能够处理图像分类:

  • Linear projection layer: Linear Projection Layer 的主要作用是将输入的图像块(patches)映射到一个高维空间,即将原始像素值转换为一个更适合模型处理的表征(embedding)。这是通过应用一个线性变换实现的,通常伴随着一个可训练的权重矩阵。这个层使得每个图像块的数据可以被后续的Transformer结构以适合其操作的形式处理。在Vision Transformer中,图像块首先被线性投影到一个与Transformer内部维度相匹配的空间中。

  • Classification token:在模型的输入阶段,[CLS] token 被初始化为一个固定的向量,并与处理过的图像块(patches)一起输入到Transformer模型中(假如一个图像被划分为 N N N个patch,那么这个[CLS] token会被添加到最开始,所以图像序列会变成 N + 1 N+1 N+1)。这个token的初始值通常是随机的,但是可训练的。在模型的每一层,[CLS] token 会接受来自所有图像块的信息,并通过自注意力机制与其他块进行交互。这意味着在每个Transformer层中,[CLS] token 不仅保持自己的状态,还会根据与其他块的关系动态更新自己的状态。由于Transformer的自注意力层具有全局感受野,[CLS] token 能够捕获整个图像的全局信息。在经过所有Transformer层之后,[CLS] token 的最终状态包含了关于整个图像的综合信息。这个状态被用作图像的全局表示,用于后续的分类任务。

  • Learnable position encodings: 由于Transformer架构本身并不处理输入序列中元素的顺序信息,可学习的位置编码用于给模型提供这种空间信息。这些编码是可训练的,允许模型动态学习如何最好地利用这些信息。位置编码确保即使在处理图像块时,模型也能考虑到每个块在原始图像中的相对或绝对位置。

  • MLP head: MLP Head是位于Transformer架构末端的多层感知机(Multi-Layer Perceptron),通常包含几个全连接层和非线性激活函数。在图像分类任务中,MLP Head通常接收经过所有Transformer层处理后的[CLS] token作为输入,输出最终的分类预测。这个头部网络负责将Transformer的高维特征映射到预测的类别上。

参考资料

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、付费专栏及课程。

余额充值