swin-Transformer论文详解 – 潘登同学的深度学习笔记

文章目录

    • swin-Transformer论文详解 -- 潘登同学的深度学习笔记
  • 前言
  • 网络架构
    • Swin transformer Block
    • 巧妙的Mask
  • 实验

前言

swin-Transformer作为CVPR 21的最佳论文,在几乎所有下游任务都表现地很出色;swin-Transformer的全称是Hierarchical Vision Transformer using Shifted Windows
核心是怎么采用Hierarchical的方式来应用Transformer,从而是的CV与NLP更好的融合;

在VIT那篇论文中,研究团队只是做了VIT用于图像分类的任务,并没有把所有任务都刷过,所以大家还是对Transformer用于CV领域有所担心,而swin-Transformer就是解决这种担心的;

将transformer用于CV领域还是有两大方面的难题的

  • 语义尺度问题(对于空间上靠前的物体与靠后的物体的尺度是不同的,但是可能表示同样的语义信息)
  • 图片大小问题(因为VIT做了patch,得到的token长度都是定死的)

目标检测与语义分割的经典架构

  • 目标检测要框不同尺寸的物体,常用架构就是FPN
  • 语义分割不仅要找到物体,还要画出来,常用架构就是U-Net

VIT的问题

  • 在做patch的时候,始终是在整张图上做patch,学的始终是整张图的信息
  • 一个patch中的序列长度,是随着整张图的长度变化而平方级别地变大
  • 没有CNN的先验知识

为什么把NLP的模型用于CV领域会表现的很好

  • 因为Transformer具有很强地连接上下文的能力,在一张图片里面,所有物体不是孤立的而是有关系的

网络架构

以ImageNet的图片为例,输入图片大小为224x224x3;

  1. Patch projection层: 每个patch的大小是4x4,那么就有56x56个patch,将patch展平得到4x4x3=48长度的token,所以输入就是[56x56]x48;
  2. Linear Embedding层: 接一层Embedding,得到[56x56]x96;
  3. Swin transformer Block:因为本质是transformer,所以输入输出维度一致,先不管;
  4. Patch Merging:是一种下采样的方式,这里是下采样两倍,就是把原特征图以2x2为一块框住,标上序号,将所有序号为1的挑出来作为一个张量,以此类推,得到 W 2 ∗ H 2 ∗ C \frac{W}{2}*\frac{H}{2}*C 2W2HC的四个张量,将其拼接得到 W 2 ∗ H 2 ∗ 4 C \frac{W}{2}*\frac{H}{2}*4C 2W2H4C; 但是为了与CNN的思想一致,就是一次改变通道数只是想让其翻倍,后面接了1x1的卷积,得到[28x28]x192;
  5. 以恰当的方式重复4次以上过程
  6. 接global average pooling将最后[7x7]x768的输出变为[1x1]x768;
    1. 如果是做分类的话,接FC得到[1x1]x1000;

Swin transformer Block

Swin transformer Block是Swin transformer的主要贡献,核心是只对每个窗口做自注意力,但是一个self-attention只能做一个序列,这里一个窗口就是一个序列,要做一个图的所有窗口,就要用多头注意力(这里的多头与之前的不一样,之前主要是为了并行计算的,现在真就是多头)

  • 最小的计算单元是一个patch: 长度为96的一个向量(作为一个token);
  • 中型计算单元为一个窗口: 总共有7x7个patch,也就对应序列长度为49;
  • (以第一层举例)总共有8x8(56/7)个窗口,那么就有64个多头;

为了说明相较于全局的patch(VIT中),基于滑动窗口的自注意力能减少计算量,作者粗略计算了一下:

  • 一个图片有hxw个patch,每个patch的通道数是C

  • 对于VIT来说,一个token进入QKV就是 3 C 2 3C^2 3C2的计算复杂度,Q与所有K之间内积(向量点乘)是 h w C hwC hwC, 内积结果与所有V相乘就是 h w C hwC hwC,最后所有一个QK对应的所有V都做一个FC层就是 C 2 C^2 C2

  • 那么总共有 h ∗ w h*w hw个token,所以总的计算复杂度就是
    Ω ( M S A ) = h w ( 4 C 2 + 2 h w C ) \Omega(MSA) = hw(4C^2 + 2hwC) Ω(MSA)=hw(4C2+2hwC)

  • 对于Swin transformer来说,可以套用上面的结果,一个窗口有MxM个patch,总共有 h w M 2 \frac{hw}{M^2} M2hw个窗口,所以计算复杂度就是
    Ω ( W − M S A ) = h w M 2 M 2 ( 4 C 2 + 2 M 2 C ) = h w ( 4 C 2 + 2 M 2 C ) \Omega(W-MSA) = \frac{hw}{M^2} M^2(4C^2 + 2M^2C) = hw(4C^2 + 2M^2C) Ω(WMSA)=M2hwM2(4C2+2M2C)=hw(4C2+2M2C)

  • 对于VIT来说hw就是196,而现在降为了49;

为了做滑动窗口之间的交互,在进入下一个transformer中需要对滑动窗口做shift,论文中shift的尺寸是每个窗口的一半,这里做了向下取整,使得所有滑动窗口向右、向下shift3个patch

  • 所以我们在网络架构图中看到的block单元中的transfromer个数一定是偶数个,因为一层普通的W-MSA完事之后一定要shift接一层SW-MSA

如图所示,但这样做会导致窗口的数量增加,而且窗口的大小也不相同;

有这样一些解决思路

  1. 直接不管,一个窗口的patch数量不一致就等于序列长度不一,直接mask掉就行;
  2. 给那些窗口大小比正常49个patch少的窗口补一圈零;

但上述的解决方案都会导致窗口数量增加,导致计算复杂度增加;

巧妙的Mask

解决方案

  • 论文给出了割补法的解决方案如图所示,就是将左上角那些残缺不全的窗口补到右下角去;

但随之而来的会产生一个问题: 在做自注意力的时候,可能会导致不合适的自注意力,因为图片上方可能是天空,而下方是地面,一作自注意力后就会导致原本无关的东西变得相关,显然不合理;

  • 所以论文采用了几个mask模板来解决自注意力的问题;如下图所示

对于上图,其中的序号表示shift完之后的窗口;

  • 0是一个完整的窗口,所以做self-attention直接做就行
  • 3和6分别是两个窗口,其中窗口3的大小是 4 ∗ 7 4*7 47个patch,而6的窗口的大小则是 3 ∗ 7 3*7 37的;将3窗口的28个向量与6窗口的21个向量拼接得到矩阵,矩阵与自己的转置相乘(第一行乘每一列放到第一行上去(经典线代)),那么得到的新矩阵就如上图的window2所示,其中黄色的部分就是3与3、6与6矩阵相乘得到的数,紫色部分就是其3与6、6与3矩阵相乘的结果;
  • 将一个事先定义好的mask模板,黄色部分是0,紫色部分是一个负很大的数与自注意力得到的结果相加,做softmax,自然就将不合适的部分mask掉了;

对于window1,window3的操作也类似,只不过在拼接矩阵的时候,对窗口1和窗口2的拼接是交错的(因为patch的序号是从左到右从上到下),所以mask模板要做对应调整,window3就是融合了两者了;

实验

实验部分就跳过,nb就完事了,在21年在ADE20k数据集上全面领跑目标检测与语义分割等下游任务;

swin-Transformer论文详解相关推荐

  1. 【神经网络架构】Swin Transformer细节详解-1

    目录 源码: 1. Patch Partition + Liner Embedding 模块 2. Swin Transformer block(一个完整的W-MSA) partition windo ...

  2. Transformer(二)--论文理解:transformer 结构详解

    转载请注明出处:https://blog.csdn.net/nocml/article/details/110920221 本系列传送门: Transformer(一)–论文翻译:Attention ...

  3. Transformer模型详解(图解最完整版)

    前言 Transformer由论文<Attention is All You Need>提出,现在是谷歌云TPU推荐的参考模型.论文相关的Tensorflow的代码可以从GitHub获取, ...

  4. transfromer-XL论文详解

    transfromer-XL论文详解 – 潘登同学的NLP笔记 文章目录 transfromer-XL论文详解 -- 潘登同学的NLP笔记 Vanilla Transformer Segment-Le ...

  5. 一文看懂Transformer(详解)

    文章目录 Transformer 前言 网络结构图: Encoder Input Embedding Positional Encoder self-attention Padding mask Ad ...

  6. 图注意力网络GAT - 《Graph Attention Networks》论文详解

    目录 前言 正文 图注意力机制层(Graph Attentional Layer) 层的输入 注意力系数 归一化注意力系数 通过邻居节点更新自身节点 层的输出 GAT相比于先前研究的优势 附作者简介 ...

  7. Transformer原理详解

    Transformer原理详解 一.前言 在学习Transformer之前,需要掌握Attention机制.Encoder-Decoder.Self-Attention机制的基础知识,可以参考本人的博 ...

  8. Transformer代码详解: attention-is-all-you-need-pytorch

    Transformer代码详解: attention-is-all-you-need-pytorch 前言 Transformer代码详解-pytorch版 Transformer模型结构 各模块结构 ...

  9. 智能城市dqn算法交通信号灯调度_博客 | 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型...

    原标题:博客 | 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型 国际数据挖掘领域的顶级会议 KDD 2018 在伦敦举行,今年 KDD 吸引了全球范围内共 1480 篇论文投递,共 ...

最新文章

  1. apache mysql php实现最大负载的方法_如何架设高性能nginx+php+mysql搭配的服务器,解决高并发问题...
  2. LiveVideoStackCon深圳-服务端的任务越来越重
  3. 但救地球要紧的飞鸽传书
  4. background-origin:规定 background-position 属性相对于什么位置来定位
  5. 罗永浩吐槽卖小米、苹果被骂,卖华为也被骂,李楠:警惕键盘侠
  6. java eclipse 入门_Eclipse使用入门教程介绍
  7. zabbix之 qq邮件报警
  8. 第45届ICPC 昆明站 临时模板补充
  9. win10 安装tensorflow-gpu
  10. SwiftUI 高级用法之ForEach如何使用 enumerated() UserDefaults.standard(教程含源码)
  11. LeetCode12. 整数转罗马数字 / 剑指 Offer 40. 最小的k个数 / 剑指 Offer 41. 数据流中的中位数
  12. PNP型三极管是不是要发射极接正电压,基极和集电极接地才能工作?能给张图不?
  13. ExecuteNonQuery()的用法
  14. 毕业后的档案问题——详细流程
  15. 1451_TC275 DataSheet阅读笔记12_时钟、温度以及供电
  16. android studio中光线传感器解析
  17. Springboot+Vue实现发表文章功能
  18. 仿微信换头像(旋转、还原、裁剪、缩放等)
  19. 开发部工程师工作指导及规范
  20. NOIP2021总结

热门文章

  1. 放弃FastJson!一篇就够,Jackson的功能原来如此之牛(万字干货)
  2. 睡眠、出轨、八字都能测了,手机距离测量万物还有多远?
  3. 常州SEO姜东:百度资源平台站点验证图文怎么做?
  4. Pointcut注解表达式@target、@annotation、@within、this、target、within等
  5. 推荐系统_经典推荐方法
  6. 支持直接外链的最佳网络硬盘OpenDrive
  7. RT-Thread-Nano使用Jlink-RTT实现Shell
  8. 老罗的聊天宝,Low的另一面
  9. 攒了一冬的甜,米易枇杷借力新电商走出川西大山
  10. 小学计算机反思案例,小学数学教学案例分析与反思