Transformer 架构因其强大的通用性而备受瞩目,它能够处理文本、图像或任何类型的数据及其组合。其核心的“Attention”机制通过计算序列中每个 token 之间的自相似性,从而实现对各种类型数据的总结和生成。在 Vision Transformer 中,图像首先被分解为正方形图像块,然后将这些图像块展平为单个向量嵌入。这些嵌入可以被视为与文本嵌入(或任何其他嵌入)完全相同,甚至可以与其他数据类型进行连接。通常图像块的创建步骤会与使用 2D 卷积的第一个可学习的非线性变换相结合,这对于初学者来说可能比较难以理解,所以本文将深入探讨这一过程。

Vision Transformer中的图像块嵌入详解:线性投影和二维卷积的数学原理与代码实现_人工智能

数据准备

为了简单起见,本文使用 MNIST 数据集,这是一个手写数字的集合,常用于训练基本的图像分类器。MNIST 图像在 PyTorch 中可以直接获取,并且可以使用

DataLoader
  • 1.

类方便地加载:

from torchvision.datasets.mnist import MNIST
from torch.utils.data import DataLoader
import torchvision.transforms as T
import torch

torch.manual_seed(42)

img_size = (32,32) #我们将把 MNIST 图像调整为这个大小
batch_size = 4

transform = T.Compose([
  T.ToTensor(),
  T.Resize(img_size)
])

train_set = MNIST(
  root="./../datasets", train=True, download=True, transform=transform
  )

train_loader = DataLoader(train_set, shuffle=True, batch_size=batch_size)

 batch = next(iter(train_loader)) #加载第一个批次
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

上述代码首先下载 MNIST 数据集,然后定义一个 PyTorch 变换,该变换将图像转换为 PyTorch 张量并将其大小调整为 32x32。接着,使用

DataLoader
  • 1.

类加载一个大小为 batch_size = 4 的图像批次。

torch.manual_seed
  • 1.

函数用于将随机数生成器初始化为相同的值,以确保读者在自己的 notebook 中能够看到与本文中相同的图像。有关 PyTorch 的

DataSet
  • 1.

DataLoader
  • 1.

类的更多信息,请参考以下链接:

可以使用 matplotlib 可视化该批次,其中包含四个图像和对应的四个标签:

import matplotlib.pyplot as plt

#batch[0] 包含图像,batch[1] 包含标签
images = batch[0]
labels = batch[1]

#为子图创建一个图形和轴
fig, axes = plt.subplots(1, batch_size, figsize=(12, 4))

#迭代图像和标签的批次
for i in range(batch_size):
  #将图像张量转换为 NumPy 数组,如果它是灰度图像,则删除通道维度
  image_np = images[i].numpy().squeeze()

  #在相应的子图中显示图像
  axes[i].imshow(image_np, cmap='gray')  #对灰度图像使用 'gray' cmap
  axes[i].set_title(f"Class: {labels[i].item()}") #假设标签是张量,使用 .item() 获取值
  axes[i].axis('off')

# 调整子图之间的间距
plt.tight_layout()

#显示绘图
 plt.show()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

Vision Transformer中的图像块嵌入详解:线性投影和二维卷积的数学原理与代码实现_ViT_02

上图展示了使用上述代码生成的四个随机 MNIST 图像。

图像块的创建

使用 Transformer 神经网络处理图像的第一步是将其分解为图像块。例如,可以将 32x32 的图像分解为 64 个 4x4 的图像块(每个块包含 16 个像素)、16 个 8x8 的图像块(每个块包含 64 个像素)或 4 个 16x16 的图像块(每个块包含 256 个像素):