【深度学习】Swin Transformer结构和应用分析

这把我C 2021-06-24 10:38:30 6349

【深度学习】Swin Transformer结构和应用分析

在这里插入图片描述

文章目录
1 引言
2 Swin Transformer结构
3 分析
    3.1 Hierarchical Feature Representation(层次特征表示)
    3.2 降采样
    3.3 局部dependency
4 总结
5 代码测试

1 引言

目前Transformer应用到图像领域主要有两大挑战:

视觉实体变化大,在不同场景下视觉Transformer性能未必很好
图像分辨率高,像素点多,Transformer基于全局自注意力的计算导致计算量较大
针对上述两个问题,我们提出了一种包含滑窗操作,具有层级设计的Swin Transformer。

其中滑窗操作包括不重叠的local window,和重叠的cross-window。将注意力计算限制在一个窗口中,一方面能引入CNN卷积操作的局部性,另一方面能节省计算量。

2 Swin Transformer结构

根据层数的不同,Swin Transformer包含多个版本:

Swin-T(iny),0.25倍的Swin-B
Swin-S(mall),0.5倍的Swin-B
Swin-B(ase)
Swin-L(arge),2倍的Swin-B
下图中的(a)是Swin-T的结构,但是不论哪个版本,Swin都包含4个"Stage",区别就是不同版本的Stage中的层数不同,以Swin-T为例,Stage 1有2层,Stage 2有2层,Stage 3有6层,Stage 4有2层。有没有发现各个Stage的层数都是偶数?再看下图中的(b),两个连续的Swin Block(层),实际上这两层组成了一个大的“基本单元”,比如Stage 1有2层,实际上就是包含一个(b),而Stage 3有6层,就包含三个(b)。
在这里插入图片描述

3 分析

Swin Transformer最重要的两点是hierarchical feature representation和SW-MSA(Shifted Window based Multi-head Self-attention)。

3.1 Hierarchical Feature Representation(层次特征表示)

Hierarchical feature representation的思路取自CNN结构,整个模型分为不同stage,每个stage对上一个stage输出的feature map进行降采样(H、W变小);stage中每个block对局部进行建模而非全局。

在这里插入图片描述

3.2 降采样

Swin Transformer中通过Patch Partition和Patch Merging来实现降采样,实际上二者是一个东西,也就是kernel size与stride相同的conv。Patch Partition的kernel size和stride为4,Patch Merging的kernel和stride为2,跟CNN中的降采样方法相同。

3.3 局部dependency

W-MSA(window based Multi-head Self-Attention)建模的是局部window的dependency,而不是MSA(Multi-head Self-Attention)中的全局,这有助于降低模型的计算复杂度,这个思路跟conv是一样的。W-MSA跟conv类似,也有kernel size和stride两个参数,在同一个stage里,conv的kernel size一般大于stride,比如经典的kernel size为3,stride为1。但是W-MSA在同一个stage里的kernel size和stride相同,这导致了一个问题——feature map上相邻的window之间永远不会交互,也就是一个stage中有1个W-MSA和N个W-MSA的感受野是没区别的。CNN中因为kernel size比stride大,随着conv的堆叠,感受野会逐步增加;MSA因为kernel size完全覆盖feature map,所以每个MSA都具备全局感受野。为了缓解这个问题,作者给W-WSA打了个补丁,得到了SW-MSA(Shifted Window based Multi-head Self-attention)

在这里插入图片描述
Swin Transformer中连续的block会依次交替使用W-MSA和SW-MSA。SW-MSA相比W-MSA唯一不同的地方在于将window进行shift,这种思路跟TSM异曲同工之妙。TSM想通过2D conv将时序信息encode进来,于是将各个frame的feature map在T维度进行shift;SW-MSA为了让相邻window之间产生交互,对window进行shift。
在这里插入图片描述

4 总结

Swin Transformer使用CNN结构设计中的一些理念(降采样、局部dependency、TSM)来重新设计Transformer,和我之前在如何看待Transformer在CV上的应用前景,未来有可能替代CNN吗?的回答不谋而合。SW-MSA这种解决方法我感觉不够优雅,应该有其他替代方案,比如W-MSA中的kernel size大于stride,这样就类似于CNN,随着block的增加感受野可以逐渐变大。

5 代码测试

配置环境
把这份代码clone到你的服务器上,或者本地
git clone https://github.com/microsoft/Swin-Transformer.git
cd Swin-Transformer

创建运行环境,并进入环境
conda create -n swin python=3.7 -y
conda activate swin

安装需要的环境
conda install pytorch==1.7.1 torchvision==0.8.2 cudatoolkit=10.1 -c pytorch

这里注意一下自己的环境,我这边的cuda是10.1的,所以可以直接按着官方给的这个来。怎么看自己的cuda环境呢,有很多种方法,最靠谱的是这个:

cat /usr/local/cuda/version.txt

别看nvidia-smi的那个,那个不准。

安装 timm==0.3.2:
pip install timm==0.3.2

好了,大头来了,坑爹的apex,安装它是相当的难受。
我是在另一台服务器上玩儿不来,然后换了一台又可以了,挺迷的。大伙儿可以先按照官方的那个操作来,如果安装不了,可以下载我这边提供的apex文件,然后再按照官方的那个操作再来一遍。注意啊,apex安装不成功的原因基本就是cuda版本和torch版本不匹配,这个我已经有心理阴影了,在这里不多提。假设你这边下载了我这边的apex文件,尽量和我一致吧,把apex文件放在swin-transformer这个代码文件之外,别掺和在一起。然后按照以下操作:

cd apex
pip install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./

继续安装其他环境

pip install opencv-python==4.4.0.46 termcolor==1.1.0 yacs==0.1.8

环境配置完毕!!!

数据集
官方这边匹配代码的数据集是imagenet,但是imagenet太大了,咱只是想跑通一下,然后看看里面的源码咋回事儿,感觉感觉,犯不着去下载这么大的数据。真羡慕你们能看到这篇博客,来来来,我这儿提供了小型版的imagenet的数据集,统一放到下面了,百度网盘自取。

运行代码
有了数据,有了代码,那就运行了

首先是训练的运行方式:

python -m torch.distributed.launch --nproc_per_node 4 --master_port 12345 main.py --cfg configs/swin_tiny_patch4_window7_224.yaml --data-path imagenet --batch-size 64

--data-path对应的就是数据文件所在的位置

然后是测试的运行方式:

python -m torch.distributed.launch --nproc_per_node 1 --master_port 12345 main.py --eval --cfg configs/swin_tiny_patch4_window7_224.yaml --resume /pth/swin_tiny_patch4_window7_224.pth --data-path imagenet
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 93 5 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
这把我C
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区