在之前的笔记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会把图像转换为一个序列,序列中的每个元素都是一个小的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的高维特征映射到预测的类别上。