原视频链接:https://www.bilibili.com/video/BV1pL4y1v7jC/?spm_id_from=333.788&vd_source=f04f16dd6fd058b8328c67a3e064abd5
参考博文:2021-Swin Transformerhttps://blog.csdn.net/wujing1_1/article/details/124871307
与vision transformer对比
Swin-Transformer的feature map具有层次性,而vit直接下采样16倍
Swin-Transformer的feature map被一个一个的窗口分割开,窗口与窗口之间没有重叠,Vit中并没有进行分割,因此Swin-Transformer可以在每一个窗口内部进行multihead-self attention计算,window与window之间不进行信息的传递,大大减少计算量
网络结构
<1>首先将图片输入到Patch Partition模块中进行分块
即每4x4相邻的像素为一个Patch,然后在channel方向展平(flatten)。假设输入的是RGB三通道图片,那么每个patch就有4x4=16个像素,然后每个像素有R、G、B三个值所以展平后是16x3=48,所以通过Patch Partition后图像shape由 [H, W, 3]变成了 [H/4, W/4, 48]。然后在通过Linear Embeding层对每个像素的channel数据做线性变换,由48变成C,即图像shape再由 [H/4, W/4, 48]变成了 [H/4, W/4, C]。其实在源码中Patch Partition和Linear Embeding就是直接通过一个卷积层实现的,和之前Vision Transformer中讲的 Embedding层结构一模一样。
Stage1:
第一个模块是 linear embedding层,patch partition+linear embedding其实效果和patch merging效果差不多
每个窗口在channel方向进行展平,因为是三通道所以channel是3*16 = 48
linear Embedding对输入特征矩阵的channel进行调整,C根据swintranformer的类型不同有所调整
stage234:
后面都是patch merging层
W-MSA
对比计算量
矩阵中flops的计算方法
shifted windows
解决W-MSA窗口之间没有信息通讯的问题,于是W-MSA的下一层一般都是SW-MSA
大概是这样一个过程:
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
更加高效方法的详解
图片理解:
原始window↓
A和C移到下面去
A和BB移到右面去
4为4*4window,3和5合并为4*4window,7和1合并为4*4window,8 6 2 0 合并为4*4window
5和3在原图中不是相邻的区域,如果计算MSA则会出现问题,只能单独进行计算,具体计算方法↓
根据attention计算公式,这里每一个窗口都要计算QKV
因此,区域3attention得到的数据还是区域5的数据,区域3和5分隔开了
最后还原回原始数据的排列
再举个例子:
对于这4个橘色的可以直接进行MSA操作,每个window都能融合上一层四个window的信息
紫色区域进行mask -msa,不让原图上不相邻区域进行信息的交流
相对位置偏置
相对位置偏移
相对位置索引和绝对位置索引
如何把二元坐标转化为一元坐标
*我们真正训练的是bias table里面的参数,
为啥是2M-1呢↓
模型详细配置参数