视觉变换器在图像分类中的应用

视觉变换器是一种结合了计算机视觉和自然语言处理的强大工具。它通过将图像分割成小块,然后线性嵌入并添加位置嵌入,将这些序列输入到变换器编码器中。最终,为了对图像进行分类,在图像序列的开头插入一个[CLS]标记。这种模型在图像分类任务中取得了最先进的性能,与传统的卷积神经网络相媲美。

为了准备视觉变换器环境,首先安装了HuggingFace的transformers库。所有剩余的依赖项都已在Google Colab环境中预安装。通过Roboflow,可以下载和预处理自定义的视觉变换器图像分类数据。将使用公共的剪刀石头布分类数据集作为本教程的目的,但也可以将自己的数据导入到Roboflow中,并导出它以训练适合自己需求的视觉变换器。

训练视觉变换器,遵循以下步骤:下载基础视觉变换器模型,使用Roboflow下载和预处理自定义视觉变换器图像分类数据,定义视觉变换器模型,使用视觉变换器特征提取器训练模型,以及在测试图像上应用视觉变换器。

在准备自定义数据时,如果数据是私有的,可以升级到付费计划以导出数据,以便使用像本教程这样的外部训练程序,或者尝试使用Roboflow的内部训练解决方案。然后,只需生成数据集的新版本并导出为"文件夹结构"。将收到一个类似于Roboflow提供的Jupyter笔记本命令。

视觉变换器可以分成三个不同的层次:ViTModel、Dropout和Linear。ViTModel是HuggingFace transformers库提供的基础模型,是视觉变换器的核心。Dropout用于正则化以防止过拟合,模型将使用0.1的dropout值。Linear是最终对图像进行分类的层次,它接受的输入大小与ViTModel上的隐藏节点数量一样大,并且输出层等于不同类别的数量。

模型还将具有其他设置:Epochs(训练数据的迭代次数)、Batch Size(每次迭代中使用的培训示例数量)、Learning Rate(寻找损失函数最小值时的步长)、Feature Extractor(识别图像中的关键组件和模式的工具)、Optimizer(改变网络参数的算法)和Loss Function(定义模型性能的函数)。

为了训练模型,编写了一个手动训练脚本(可以在笔记本中找到)。在每批图像可以通过模型之前,有必要将图像输入到ViT特征提取器中以获得嵌入。为此,首先需要对批次应用转换,以确保它符合特征提取器的适当约束。特征提取器需要一个图像列表,每个图像应该具有(num_channels, height, width)的形状。

# 分割批次图像到图像列表并删除不必要的维度 x = np.split(np.squeeze(np.array(x)), BATCH_SIZE) # 删除不必要的维度(即大小为1的维度) for index, array in enumerate(x): x[index] = np.squeeze(array)

最后,应用特征提取器,并将单独的矩阵重新堆叠回一个大矩阵,因为ViTModel需要一个形状为(batch_size, num_channels, height, width)的张量对象:

x = torch.tensor(np.stack(feature_extractor(x)['pixel_values'], axis=0))

HuggingFace文档提供了更多关于ViTFeatureExtractor和ViTModel的信息。然后,这些特征将通过模型并完成其余的训练过程。从损失和测试准确性来看,视觉变换器似乎能够快速训练,同时获得高准确性。例如:

最后,可以在数据集中的随机图像上测试视觉变换器。这样做,得到:

从外观上看,视觉变换器似乎工作得很好!

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485