Transformer 架构因其强大的通用性而备受瞩目,它能够处理文本、图像或任何类型的数据及其组合。其核心的“Attention”机制通过计算序列中每个 token 之间的自相似性,从而实现对各种类型数据的总结和生成。在 Vision Transformer 中,图像首先被分解为正方形图像块,然后将这些图像块展平为单个向量嵌入。这些嵌入可以被视为与文本嵌入(或任何其他嵌入)完全相同,甚至可以与其他数据类型进行连接。通常图像块的创建步骤会与使用 2D 卷积的第一个可学习的非线性变换相结合,这对于初学者来说可能比较难以理解,所以本文将深入探讨这一过程。
数据准备
为了简单起见,本文使用 MNIST 数据集,这是一个手写数字的集合,常用于训练基本的图像分类器。MNIST 图像在 PyTorch 中可以直接获取,并且可以使用
类方便地加载:
上述代码首先下载 MNIST 数据集,然后定义一个 PyTorch 变换,该变换将图像转换为 PyTorch 张量并将其大小调整为 32x32。接着,使用
类加载一个大小为 batch_size = 4 的图像批次。
函数用于将随机数生成器初始化为相同的值,以确保读者在自己的 notebook 中能够看到与本文中相同的图像。有关 PyTorch 的
和
类的更多信息,请参考以下链接:
可以使用 matplotlib 可视化该批次,其中包含四个图像和对应的四个标签:
上图展示了使用上述代码生成的四个随机 MNIST 图像。
图像块的创建
使用 Transformer 神经网络处理图像的第一步是将其分解为图像块。例如,可以将 32x32 的图像分解为 64 个 4x4 的图像块(每个块包含 16 个像素)、16 个 8x8 的图像块(每个块包含 64 个像素)或 4 个 16x16 的图像块(每个块包含 256 个像素):