swin-Transformer论文详解
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;
- Patch projection层: 每个patch的大小是4x4,那么就有56x56个patch,将patch展平得到4x4x3=48长度的token,所以输入就是[56x56]x48;
- Linear Embedding层: 接一层Embedding,得到[56x56]x96;
- Swin transformer Block:因为本质是transformer,所以输入输出维度一致,先不管;
- Patch Merging:是一种下采样的方式,这里是下采样两倍,就是把原特征图以2x2为一块框住,标上序号,将所有序号为1的挑出来作为一个张量,以此类推,得到 W 2 ∗ H 2 ∗ C \frac{W}{2}*\frac{H}{2}*C 2W∗2H∗C的四个张量,将其拼接得到 W 2 ∗ H 2 ∗ 4 C \frac{W}{2}*\frac{H}{2}*4C 2W∗2H∗4C; 但是为了与CNN的思想一致,就是一次改变通道数只是想让其翻倍,后面接了1x1的卷积,得到[28x28]x192;
- 以恰当的方式重复4次以上过程
- 接global average pooling将最后[7x7]x768的输出变为[1x1]x768;
- 如果是做分类的话,接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 h∗w个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) Ω(W−MSA)=M2hwM2(4C2+2M2C)=hw(4C2+2M2C)对于VIT来说hw就是196,而现在降为了49;
为了做滑动窗口之间的交互,在进入下一个transformer中需要对滑动窗口做shift,论文中shift的尺寸是每个窗口的一半,这里做了向下取整,使得所有滑动窗口向右、向下shift3个patch;
- 所以我们在网络架构图中看到的block单元中的transfromer个数一定是偶数个,因为一层普通的W-MSA完事之后一定要shift接一层SW-MSA
如图所示,但这样做会导致窗口的数量增加,而且窗口的大小也不相同;
有这样一些解决思路
- 直接不管,一个窗口的patch数量不一致就等于序列长度不一,直接mask掉就行;
- 给那些窗口大小比正常49个patch少的窗口补一圈零;
但上述的解决方案都会导致窗口数量增加,导致计算复杂度增加;
巧妙的Mask
解决方案
- 论文给出了割补法的解决方案如图所示,就是将左上角那些残缺不全的窗口补到右下角去;
但随之而来的会产生一个问题: 在做自注意力的时候,可能会导致不合适的自注意力,因为图片上方可能是天空,而下方是地面,一作自注意力后就会导致原本无关的东西变得相关,显然不合理;
- 所以论文采用了几个mask模板来解决自注意力的问题;如下图所示
对于上图,其中的序号表示shift完之后的窗口;
- 0是一个完整的窗口,所以做self-attention直接做就行
- 3和6分别是两个窗口,其中窗口3的大小是 4 ∗ 7 4*7 4∗7个patch,而6的窗口的大小则是 3 ∗ 7 3*7 3∗7的;将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论文详解相关推荐
- 【神经网络架构】Swin Transformer细节详解-1
目录 源码: 1. Patch Partition + Liner Embedding 模块 2. Swin Transformer block(一个完整的W-MSA) partition windo ...
- Transformer(二)--论文理解:transformer 结构详解
转载请注明出处:https://blog.csdn.net/nocml/article/details/110920221 本系列传送门: Transformer(一)–论文翻译:Attention ...
- Transformer模型详解(图解最完整版)
前言 Transformer由论文<Attention is All You Need>提出,现在是谷歌云TPU推荐的参考模型.论文相关的Tensorflow的代码可以从GitHub获取, ...
- transfromer-XL论文详解
transfromer-XL论文详解 – 潘登同学的NLP笔记 文章目录 transfromer-XL论文详解 -- 潘登同学的NLP笔记 Vanilla Transformer Segment-Le ...
- 一文看懂Transformer(详解)
文章目录 Transformer 前言 网络结构图: Encoder Input Embedding Positional Encoder self-attention Padding mask Ad ...
- 图注意力网络GAT - 《Graph Attention Networks》论文详解
目录 前言 正文 图注意力机制层(Graph Attentional Layer) 层的输入 注意力系数 归一化注意力系数 通过邻居节点更新自身节点 层的输出 GAT相比于先前研究的优势 附作者简介 ...
- Transformer原理详解
Transformer原理详解 一.前言 在学习Transformer之前,需要掌握Attention机制.Encoder-Decoder.Self-Attention机制的基础知识,可以参考本人的博 ...
- Transformer代码详解: attention-is-all-you-need-pytorch
Transformer代码详解: attention-is-all-you-need-pytorch 前言 Transformer代码详解-pytorch版 Transformer模型结构 各模块结构 ...
- 智能城市dqn算法交通信号灯调度_博客 | 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型...
原标题:博客 | 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型 国际数据挖掘领域的顶级会议 KDD 2018 在伦敦举行,今年 KDD 吸引了全球范围内共 1480 篇论文投递,共 ...
最新文章
- apache mysql php实现最大负载的方法_如何架设高性能nginx+php+mysql搭配的服务器,解决高并发问题...
- LiveVideoStackCon深圳-服务端的任务越来越重
- 但救地球要紧的飞鸽传书
- background-origin:规定 background-position 属性相对于什么位置来定位
- 罗永浩吐槽卖小米、苹果被骂,卖华为也被骂,李楠:警惕键盘侠
- java eclipse 入门_Eclipse使用入门教程介绍
- zabbix之 qq邮件报警
- 第45届ICPC 昆明站 临时模板补充
- win10 安装tensorflow-gpu
- SwiftUI 高级用法之ForEach如何使用 enumerated() UserDefaults.standard(教程含源码)
- LeetCode12. 整数转罗马数字 / 剑指 Offer 40. 最小的k个数 / 剑指 Offer 41. 数据流中的中位数
- PNP型三极管是不是要发射极接正电压,基极和集电极接地才能工作?能给张图不?
- ExecuteNonQuery()的用法
- 毕业后的档案问题——详细流程
- 1451_TC275 DataSheet阅读笔记12_时钟、温度以及供电
- android studio中光线传感器解析
- Springboot+Vue实现发表文章功能
- 仿微信换头像(旋转、还原、裁剪、缩放等)
- 开发部工程师工作指导及规范
- NOIP2021总结
热门文章
- 放弃FastJson!一篇就够,Jackson的功能原来如此之牛(万字干货)
- 睡眠、出轨、八字都能测了,手机距离测量万物还有多远?
- 常州SEO姜东:百度资源平台站点验证图文怎么做?
- Pointcut注解表达式@target、@annotation、@within、this、target、within等
- 推荐系统_经典推荐方法
- 支持直接外链的最佳网络硬盘OpenDrive
- RT-Thread-Nano使用Jlink-RTT实现Shell
- 老罗的聊天宝,Low的另一面
- 攒了一冬的甜,米易枇杷借力新电商走出川西大山
- 小学计算机反思案例,小学数学教学案例分析与反思