• Swin Transformer与Vision Transformer的区别与联系


    一、基础知识点的普及
    1.ImageNet 1k and 22k
          Currently ImageNet 22k is the whole ImageNet
          Imagenet 1k is ISLVRC2012
    在这里插入图片描述
    二、Vision Transformer
    1.Transformer最初提出是针对NLP领域的,并且在NLP领域大获成功。这篇论文也是受到其启发,尝试将Transformer应用到CV领域。关于Transformer的部分理论之前的博文中有讲,链接,这里不在赘述。通过这篇文章的实验,给出的最佳模型在ImageNet1K上能够达到88.55%的准确率(先在Google自家的JFT数据集上进行了预训练。后来在ImageNet-1k上进行了迁移学习),说明Transformer在CV领域确实是有效的,而且效果还挺惊人。
    注:表格中的ViT-H/14中的14代表的是Patch size,即每张patch的大小是patch_size×patch_size。第三列数据是在ImageNet-22K上进行了预训练并且在ImageNet-1k上进行了迁移学习。
    在这里插入图片描述
    模型详解
    在这篇文章中,作者主要拿ResNet、ViT(纯Transformer模型)以及Hybrid(卷积和Transformer混合模型)三个模型进行比较,所以本博文除了讲ViT模型外还会简单聊聊Hybrid模型。

    Vision Transformer模型详解
    下图是原论文中给出的关于Vision Transformer(ViT)的模型框架。简单而言,模型由三个模块组成:

    • Linear Projection of Flattened Patches(Embedding层)
    • Transformer Encoder(图右侧有给出更加详细的结构)
    • MLP Head(最终用于分类的层结构)
      在这里插入图片描述
      Embedding层结构详解
      ps:可以这么理解每一个patch经过embedding层,就生成了一个向量(Tocken)。
      对于标准的Transformer模块,要求输入的是token(向量)序列,即二维矩阵[num_token, token_dim],如下图,token0-9对应的都是向量,以ViT-B/16为例,每个token向量长度为768。
      对于图像数据而言,其数据格式为[H, W, C]是三维矩阵明显不是Transformer想要的。所以需要先通过一个Embedding层来对数据做个变换。如下图所示,首先将一张图片按给定大小分成一堆Patches。以ViT-B/16为例,将输入图片(224x224)按照16x16大小的Patch进行划分,划分后会得到( 224 / 16 )^ 2 = 196 个Patches。接着通过线性映射将每个Patch映射到一维向量中,以ViT-B/16为例,每个Patche数据shape为[16, 16, 3]通过映射得到一个长度为768的向量(后面都直接称为token)。[16, 16, 3] -> [768]

    在代码实现中,直接通过一个卷积层来实现。 以ViT-B/16为例,直接使用一个卷积核大小为16x16,步距为16,卷积核个数为768的卷积来实现。通过卷积[224, 224, 3] -> [14, 14, 768],然后把H以及W两个维度展平即可[14, 14, 768] -> [196, 768],此时正好变成了一个二维矩阵,正是Transformer想要的

    在输入Transformer Encoder之前注意需要加上[class]token以及Position Embedding。 在原论文中,作者说参考BERT,在刚刚得到的一堆tokens中插入一个专门用于分类的[class]token,这个[class]token是一个可训练的参数,数据格式和其他token一样都是一个向量,以ViT-B/16为例,就是一个长度为768的向量,与之前从图片中生成的tokens拼接在一起,Cat([1, 768], [196, 768]) -> [197, 768]。然后关于Position Embedding就是之前Transformer中讲到的Positional Encoding,这里的Position Embedding采用的是一个可训练的参数(1D Pos. Emb.),是直接叠加在tokens上的(add),所以shape要一样。以ViT-B/16为例,刚刚拼接[class]token后shape是[197, 768],那么这里的Position Embedding的shape也是[197, 768]
    对于Position Embedding作者也有做一系列对比试验,在源码中默认使用的是1D Pos. Emb.,对比不使用Position Embedding准确率提升了大概3个点,和2D Pos. Emb.比起来没太大差别。
    在这里插入图片描述

  • 相关阅读:
    微服务 Spring Cloud 2,一文讲透微服务核心架构(注册中心、服务通信、服务监控、服务追踪、服务治理)
    java开发常见面试问题
    计算机多媒体
    Node.js学习篇(四)express路由模块化
    QT+FFmpeg转存rtsp中的视频流,写入头文件失败
    [elastic 8.x]java客户端连接elasticsearch与操作索引与文档
    Java基础11——抽象类和接口
    chrome闪退后打不开问题 打开立即闪退
    点击谷歌浏览器安装包没有反应
    多关键字dp,P1687 机器人小Q
  • 原文地址:https://blog.csdn.net/qq_36717487/article/details/125612411