[ Transformer篇 ] 经典网络模型 —— Vision Transformer + Transformer in Transformer + Swin Transformer


🤵 AuthorHorizon John

编程技巧篇各种操作小结

🏆 神经网络篇经典网络模型

💻 算法篇再忙也别忘了 LeetCode




🚀 01. Vision Transformer


在这里插入图片描述

📜 Paper: An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale [ICLR 2021]

🖥️ GitHub: vision_transformer


🎨 结构框图

在这里插入图片描述

Figure 1. Model overview

🚩 详解

Transformer 结构在 NLP 领域已逐渐成为标准,但在 CV 领域的应用仍有限;

在此之前 注意力(attention)CV 领域的应用要么 与卷积网络结合 或者 替换掉卷积网络的某些组件,同时保留其主要结构,但卷积结构仍旧占有主导地位;

作者证明了即使不使用卷积网络结构,也能得到较好的效果,尤其是利用大规模数据集进行预训练再迁移至中小型数据集上(参考 NLP 领域中的 BERT),可以得到非常好的效果(与 ResNet 进行了比较),并且需要的训练资源也较少;

  • BERT:完形填空式训练(denoising self-supervised),挖掉完整句子中的某个词,利用模型进行预测;
  • GPT:预测型训练(language modeling),根据给定的句子预测下一个词是什么;

作者提到随着模型和数据集的增长,仍然没有 性能饱和 的迹象;

在 ImageNet, CIFAR-100, VTAB 等数据集上做了相关的对比实验;


难点:

Transformer 在 NLP 中的应用,输入是一个一维的序列,核心点是 自注意力操作,即输入的每一个元素都会两两之间进行互动得到一个Attention值,最后将得到的Attention值与输入序列进行加权平均,最后输出;

若将图片输入则需要将图片拉成一个一维的序列,拉成一维序列的方法可能是将图片的每一个 像素展开,这会得到一个非常大的一维序列,从而导致自注意力操作的计算量巨大,硬件上难以实现(BERT里序列长度为512),以图像分类任务中的 224×224 为例,转成一维序列后的长度为 1×50176,而在目标检测和图像分割任务当中图像大小更大,最后的序列更长 ;

  • 合理地将 二维图片 转成 一维序列
  • 不对标准的 Transformer 进行任何的改动,以提高模型的 可拓展性

主要方法:

Figure 1. 左侧所示为 Vison Transformer 的主要结构;

核心思想:

在图像分类任务中,主流的图片数据输入大小为 224×224

  • 将输入图像分割为 固定尺寸(16×16)的补丁(fixed-size patches) ,得到 14×14=196 个 patch;
  • 将分割后的每个 patch 通过一个线性投射层得到输入的 一维序列 ,并添加 位置编码,以保留他们之间的 位置信息
  • 输入到标准的 Transformer Encoder 模块当中 ;
  • 借鉴 BERT 模型,添加了一个 * Extra learnable [class] embedding 并将该位置的输出当成最后的输出;

在这里插入图片描述

注:
Extra learnable [class] embedding 利用自注意力操作特点,其会与输入序列的每一个元素进行交互,从而能够学习到输入序列的全局特征 ;

一维序列维度为 196×768(14×14=196;16×16×3=768);
图中的 Linear 层为一个全连接层,维度为 768×768;
加上额外的 class embedding 后,维度为197×768;
位置信息编码维度为1×768,与图片信息相加,维度仍为197×768;
最后输入 Transformer 的序列维度为 197×768;

未来展望:

拓展到视觉领域中的 检测和分割(detection and segmentation) 任务;


🚩 效果

在这里插入图片描述

Vison Transformer 模型参数

在这里插入图片描述

Vison Transformer 对比 ResNet 效果(测试准确率 及 训练时间)

在这里插入图片描述


在这里插入图片描述

使用不同数据量对模型性能的影响

在这里插入图片描述

自注意力效果

在这里插入图片描述

Transformer中不同层数间的多头自注意力(Head)学到的特征之间的距离(Mean attention distance)

Head 之间的距离越大反应学习到的全局特征越好,类似于感受野,可以看到在刚开始的几层也能学到全局特征;

在这里插入图片描述

不同超参数训练模型的位置编码效果




🚀 02. Transformer in Transformer


在这里插入图片描述

📜 Paper: Transformer in Transformer [NeurIPS 2021]

🖥️ GitHub: Efficient-AI-Backbones


🎨 结构框图

在这里插入图片描述

Figure 1. Illustration of the proposed Transformer-iN-Transformer (TNT) framework

🚩 详解

ViT 模型的注意力只关注了 patch之间的信息 而忽略了 patch内部的信息

基于此,作者将每一个 局部的 patch(16×16) 进一步划分为 更小的patch(4×4) ,一起计算以实现 特征聚合,增强模型的 表征能力

ImageNet 上实现了81.5%的 top-1 精度,而计算成本高出约1.7% ;


🚩 效果

在这里插入图片描述

ImageNet 数据集上的实验对比结果

在这里插入图片描述

TNT 与 DeiT (Transformer baseline model) 模型效果对比



🚀 03. Swin Transformer


在这里插入图片描述

📜 Paper: Swin Transformer: Hierarchical Vision Transformer using Shifted Windows [ICCV 2021 best paper]

🖥️ GitHub: Swin-Transformer


🎨 结构框图

在这里插入图片描述

Figure 1. Swin Transformer VS ViT

在这里插入图片描述

Figure 2. An illustration of the shifted window

在这里插入图片描述

Figure 3. The architecture of a Swin Transformer (Swin-T)

🚩 详解

提出了 移动窗口(shifted windows) 的概念,移动窗口可以 提高计算效率(自注意力在移动窗口内计算,计算复杂的与图像大小为 线性增长 的关系,而ViT为平方增长),通过移动的操作可以使相邻的窗口进行交互,从而实现 全局建模 的效果(Figure 2.);并利用 层级结构 可以实现多尺度特征的提取(Figure 1.)(Figure 3.(a));

目标检测和语义分割(object detection and semantic segmentation) 等任务上取得了很好的效果;

移动窗口为 7×7 大小,每一个移动窗口包含 7×7=49 patches

Swin Transformer 没有像 ViT 一样使用 class embedding ,而是对输出进行 平均池化


🚩 效果

在这里插入图片描述

shifted windows 巧妙设计

如Figure 2. 所示,如果按照那种方式进行移动窗口会使移动窗口的数量增加,无形之中增加了计算量,所以进行了改进,将A、B、C部分分别移动到右下角、右侧、下侧,并对得到的新特征图进行掩码操作,保证其位置信息不变,最后得到的移动窗口数量仍然不变;


在这里插入图片描述

图像分类对比实验结果

在这里插入图片描述

目标检测对比试验结果

在这里插入图片描述

语义分割对比试验结果



  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vision Transformer(ViT)是一种基于Transformer架构的深度学习模型,用于处理计算机视觉任务。它将图像分割成一系列的图像块,并将每个图像块作为输入序列传递给Transformer编码器。每个图像块通过一个线性投影层转换为向量表示,并与位置嵌入向量相结合,然后输入到Transformer编码器中进行处理。Transformer编码器由多个自注意力层和前馈神经网络层组成,用于学习图像中的全局和局部特征。最后,通过一个线性分类器对编码器的输出进行分类。 Vision Transformer的优点是能够在没有使用传统卷积神经网络的情况下,实现对图像的高质量特征提取和分类。它在一些计算机视觉任务上取得了与传统方法相媲美甚至更好的性能,例如图像分类、目标检测和语义分割等任务。 以下是一个使用Vision Transformer进行图像分类的示例代码[^1]: ```python import torch import torch.nn as nn from torchvision import transforms from torchvision.models import resnet50 from vit_pytorch import ViT # 加载预训练的Vision Transformer模型 model = ViT( image_size = 224, patch_size = 16, num_classes = 1000, dim = 768, depth = 12, heads = 12, mlp_dim = 3072, dropout = 0.1, emb_dropout = 0.1 ) # 加载预训练的权重 model.load_from('vit_weights.pth') # 图像预处理 transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 加载图像并进行预处理 image = Image.open('image.jpg') image = transform(image).unsqueeze(0) # 使用Vision Transformer进行图像分类 output = model(image) _, predicted_class = torch.max(output, 1) # 输出预测结果 print('Predicted class:', predicted_class.item()) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Horizon John

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值