视觉 Transformer 与卷积神经网络2024 年 8 月 28 日 | 阅读 10 分钟 引言在本教程中,我们将学习 Vision Transformers (ViT) 和卷积神经网络 (CNN) 之间的区别。Transformer 由于其有效性和灵活性已成为 NLP 的选择。在计算机视觉领域,卷积神经网络 (CNN) 架构仍然占主导地位,但一些研究人员试图将 CNN 与个人模型结合起来。在大型数据集上预训练后,Vision Transformer (ViT) 在多个尺度上优于最先进的卷积网络,同时需要更少的计算资源进行训练。 作者们测试了将 Transformer 模型直接应用于图像。他们发现,当获取平均数据信息时,模型的准确性与 ResNet 类架构相比处于平均水平。然而,当学习更大的数据集时,Vision Transformer (ViT) 取得了良好的效果,并且优于许多图像识别方法的现有方法。 Vision Transformer (ViT) 模型将 2D 图像转换为一系列 2D 块。块是使用线性投影的固定大小向量。除了块的顺序之外,Transformer 编码器的输出状态被用作在添加对象之前的表示。 使用分类头,图像表示经过预训练或微调。添加位置嵌入以存储有关位置的信息。嵌入向量的序列提供了对 Transformer 编码器的访问,该编码器具有由几个自注意力 (self-attention) 和 MLP 块组成的一系列层。 以前,图像处理的首选是 CNN 或卷积神经网络。它们擅长通过卷积技术捕捉局部空间模式,从而实现分层特征提取。CNN 擅长从大量图像数据中学习,并且已成功完成了图像分类、目标检测和分割等重要任务。 CNN 在许多计算操作中对跟踪记录非常强大。它们在处理大数据方面很有效,而 Vision Transformers 在理解世界依赖的关键概念和情况方面具有优势。然而,Vision Transformers 通常需要更多信息才能达到与 CNN 相似的性能。此外,CNN 由于其并行性具有优势,这使得它们更适用于实时和资源受限的应用。 什么是 Vision Transformer?Vision Transformer 简称 ViT。它是一种图像分类模型。ViT 被用作类似 Transformer 的图像块架构。将图像分割成固定大小的块。然后,对每个块进行线性嵌入,添加位置嵌入,并将向量的结果输入到标准的 Transformer 编码器中。添加额外学习的“分类符号”到序列中的标准方法用于执行分类。 什么是卷积神经网络 (CNN)?卷积神经网络简称 CNN。它是一种深度学习神经网络架构。在计算机视觉领域,CNN 被广泛使用。该专业领域使计算机能够理解和解释视觉图像或数据。神经网络在机器学习方面非常有效。该网络用于许多数据类型,例如图像、音频和文本。不同类型的神经网络用于不同的目的。例如,我们使用卷积神经网络来预测单词的顺序,类似于图像分类,其中我们使用神经网络(特别是 LSTM)。 示例 在这里,我们举一个 Vision Transformer 与卷积神经网络的例子。在这里,我们将使用 CNN (卷积神经网络) 和 Vision Transformer 方法来训练 Kaggle 上提供的猫和牛数据集的视觉分类。首先,我们需要从 Kaggle 下载包含 25,000 张 RGB 图像的猫和牛文件。如果您还没有,可以阅读有关如何设置 Kaggle API 证书的说明。我们可以使用提供的 Python 代码从当前工作目录下载文件。所以,代码如下所示: Kaggle 文件下载完成后,我们就可以使用一个简单的命令解压该文件。该文件的解压命令如下所示: 使用以下命令克隆 Vision-Transformer GitHub 存储库。该存储库在 Vision_tr 目录中,包含 Vision Transformer 所需的所有代码。所以,命令如下所示: 然后,我们需要清理下载的数据。这也是为训练我们的图像分类器做准备。创建以下实用程序以从 Pytorch 的 DataLoader 格式清理和加载数据。现在,代码如下所示: 卷积神经网络 (CNN) 的方法此图像分类器的 CNN 模型包含三个 2D 卷积层,核大小为 3,步长为 2,以及一个最大池化层,大小为 2。卷积后,有 2 个全连接层,每个层有 10 个节点。下面我们提供用于说明此模式的代码片段: 输出 The deleted file path is kagglecatsandcows_3067a/PetImages/Cow/non_image_file.txt The train list is 432 The test list is 288 The value list is 115 Length of the training dataset: 432 CNN( (layer1): Sequential( (0): Conv2d(2, 14, kernel_size=(3, 3), stride=(2, 2)) (1): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (2): ReLU() (3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) ) (layer2): Sequential( (0): Conv2d(14, 28, kernel_size=(3, 3), stride=(2, 2)) (1): BatchNorm2d(28, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (2): ReLU() (3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) ) (layer3): Sequential( (0): Conv2d(32, 64, kernel_size=(3, 3), stride=(2, 2)) (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (2): ReLU() (3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) ) (fc1): Linear(in_features=576, out_features=10, bias=True) (dropout): Dropout(p=0.5, inplace=False) (fc2): Linear(in_features=10, out_features=2, bias=True) (relu): ReLU() ) Vision Transformer 的方法在本教程中,我们还将学习 Vision Transformer。该架构设计有特定的尺寸,可以根据特定需求进行定制。对于此大小的图像数据集,Vision Transformer 架构仍然很大。现在我们提供下面的代码: 输出 ViT( (patch_embedding): Conv2d(3, 128, kernel_size=(28, 28), stride=(28, 28)) (position_embedding): PositionalEmbedding1D() (transformer): Transformer( (layers): ModuleList( (0): TransformerEncoderLayer( (self_attn): MultiheadAttention( (out_proj): _LinearWithBias(in_features=128, out_features=128, bias=True) ) (linear1): Linear(in_features=128, out_features=1024, bias=True) (dropout): Dropout(p=0.1, inplace=False) (linear2): Linear(in_features=1024, out_features=128, bias=True) (norm1): LayerNorm((128,), eps=1e-05, elementwise_affine=True) (norm2): LayerNorm((128,), eps=1e-05, elementwise_affine=True) (dropout1): Dropout(p=0.1, inplace=False) (dropout2): Dropout(p=0.1, inplace=False) ) (1): TransformerEncoderLayer( ... (similar structure as previous layer) ... ) ... (11): TransformerEncoderLayer( ... (similar structure as previous layer) ... ) ) ) (norm): LayerNorm((128,), eps=1e-05, elementwise_affine=True) (mlp_head): MLPHead( (fc1): Linear(in_features=128, out_features=1024, bias=True) (dropout): Dropout(p=0.1, inplace=False) (fc2): Linear(in_features=1024, out_features=2, bias=True) ) ) 在这里,我们在 ViT 中定义了八个参数。每个参数都有特定的定义,我们将在下面讨论: 1. imageSize = 230 首先,我们讨论 imageSize 参数。imageSize 初始化为 230。这是关于图像大小的讨论。在此示例中,图像大小应为 230x230 像素。 2. patchSize = 28 其次,我们讨论 patchSize 参数。patchSize 初始化为 28。这是将图像大小分割成块。在此示例中,块大小应为 28x28 像素。 3. numClass = 2 第三,我们讨论 numClass 参数。numClass 初始化为 2。这是关于分类器测试的类别数量的讨论。在此示例中,我们采用一个有两个类别的模型,例如猫和牛。 4. dimension = 128 第四,我们讨论 dimension 参数。dimension 初始化为 128。这是关于嵌入测试模型维度的讨论。在此示例中,嵌入捕获了每个图像块的表示。 5. depth = 12 第五,我们讨论 depth 参数。在此示例中,depth 初始化为 12。这是关于 ViT 或 Vision Transformers 模型深度的讨论。更复杂的特征提取允许模型拥有更高的深度。 6. heads = 8 第六,我们讨论 heads 参数。在此示例中,heads 初始化为 8。这是关于自注意力机制模型中注意力头的数量的讨论。 7. mlp_dim = 1024 第七,我们讨论 mlp_dim 参数。在此示例中,mlp_dim 初始化为 1024。这是关于模型多层感知机 (MLP) 层维度的讨论。在显示自注意力之后,多层感知机 (MLP) 会改变 token 表示。 8. drop_out = 0.1 接下来,我们讨论 drop_out 参数。在此示例中,drop_out 初始化为 0.1。用于控制 dropout 水平。这是一种用于防止过拟合问题的正则化技术。drop_out 参数可以在训练期间随机将一部分输入单元设置为 0。 9. embedded_dropout = 0.1 最后,我们讨论 embedded_dropout 参数。在此示例中,embedded_dropout 初始化为 0.1。用于控制嵌入模型中的 dropout 水平。在训练过程中,嵌入 dropout 选项有助于防止过度依赖特殊字符或 token。 Vision Transformer 使用 Tesla T4 (g4dn-xlarge) GPU 机器进行了 20 次任务分类训练。在 Vision Transformer 中,训练进行了 20 次,但在 CNN 或卷积神经网络中,训练进行了 10 个 epoch。训练次数多或训练损失的原因是收敛缓慢。而卷积神经网络或 CNN 方法在 10 个 epoch 内达到 75% 的准确率,Vision Transformer 达到 69% 的准确率,且训练时间更长。 结论在本教程中,我们学习了 Vision Transformers 和卷积神经网络之间的区别。CNN 和 Vision Transformers 在模型大小、内存需求、准确性和性能方面存在差异。CNN 模型一直以其大小和高效的内存使用而闻名,使其适用于受限环境。它在图像处理和提高各种计算机视觉应用的准确性方面也已被证明很有用。另一方面,Vision Transformers 或 ViT 用于通过提供一种强大的方法来捕获图像中全局依赖关系和理解内容,从而提高特定任务的性能。 此外,Vision Transformers 或 ViT 倾向于拥有更大的模型和更高的要求,超过卷积神经网络或 CNN。尽管它们可以取得良好的准确性,尤其是在处理更大的数据集时,但它们的计算要求可能会限制它们在资源有限情况下的有效性。最终,CNN 和 Vision Transformer 模型之间的选择取决于任务的具体需求。这取决于模型大小、内存占用、准确性、效率、大数据需求和模型复杂度之间的权衡等因素。随着计算机视觉的不断发展,预计这两种架构都会取得进一步的进展,使研究人员和从业人员能够根据其具体需求和限制做出更明智的选择。我们还了解到,CNN 方法在 10 个 epoch 内达到 75% 的准确率,而 Vision Transformer 达到 69% 的准确率。 因此,我们在此得出结论,卷积神经网络或 CNN 优于 Vision Transformers 或 ViT。 下一主题V-Net 在图像分割中的应用 |
我们请求您订阅我们的新闻通讯以获取最新更新。