Swin Transformer的学习记录

1开头就是这篇文章的作者都是华人,是亚洲的微软公司在2021在ICCV上发表的文章。是2021年最好的文章,说明这篇文章非常硬核值得关注学习。在计算机视觉的多个任务中是最好的网络。

老师说自己的网路只要精度能提升一个点就能发文章了!,所以swin提升了2个点,牛。。。

2进入了官网代码的连接,以目标检测的任务为例,在COCO数据集上面的效果最好的模型都是和swin有关的模型,其中排名第七就是现在要学习的原始swin

3第三是目录:内容比较多,其中第四和第五是比较难理解的

4先对比swin与vit

对比有两点不一样:

第一swin构建的特征图是具有层次性的,像之前的cnn一样随着特整层的不断加深,特征图的尺寸是越来越小的。这个应该如何理解呢?是这样的,从图中结构来看,随着层数的加深,每个path的尺寸越来越大,而学习vit到时候我们知道path的此村其实就是每个token的维度,尺寸越大,维度就越长,那所以token的个数就越少,在vit中你回忆一下token的个数是怎么来的?对,没错,token的个数其实就是embedding(卷积)之后的特征图的尺寸!,记得不,[3,224,224]-[768,14,14],然后token的个数就是14*14,所以swin中说的随着层数的加深,特征图的尺寸越来越小就是这个意思,意思就是说token的个数变少了。你不要把vit后面的qkv计算想成层数了,那个不是,那后面的只能算是一层TE中的多头注意力计算!swin的不同层就是相当于把一个TE当作一层,然后下一个TE会进行path的重新分配,所以一层一层之间的特征图的“尺寸”就越来越小(因为path的尺寸变大,数量变少,转换成卷积的关系就是卷积之后的特征图的通道数增多但尺寸变小),而vit的12层TE的特征图的尺寸都不会发生改变,就像右图一样,每一层的特征图的尺寸都是一致的,所以这就是第一点的不同。至于下采样的倍数是这样理解的:swin中的是先下采样4倍,再是8倍,再是16倍,一是就是先分的path的尺寸是4*4,8*8,16*16..所以你分为的path的尺寸就是你下采样的倍数,这好理解啊,因为你先下采样4倍(分为4*4的path),那你的卷积之后的特征图的尺寸就大(因为num_token多),但是通道少(因为path的尺寸小导致token_dim少),所以下采样的倍数就是逐渐增大的,而vit是一上来就是16倍的下采样,层与层之间没有层次性,然后一致保持不变。所以特征图在TE的层与层之间的传播应该是这样的:那个二维矩阵[197,768]的高度维度(token的个数)先是很多,宽度维度(每个token的维度)先是很少,后来就是逐渐的高度维度变少,宽度为度变多,脑袋里面要有那个二维矩阵变化的动图(由一个竖着的长方形变为一个横着的长方形)。其实不难,多想想就明白了。

第二是,swin中使用了一个一个的窗口将特征图进行分割了,窗口与窗口之间是没有重叠的,vit中就是一个整体,没有对特征图进行窗口划分。引入窗口就可以在每一个窗口的内部进行多头自注意力的计算,但是窗口与窗口之间是没有信息融合的,这样做的好处是可以降低运算量,尤其是在浅层网络中,就是下采样的倍率比较低的时候,token的个数就会很多,这样如果直接进行多头子注意力计算计算量就会很大(文献中说计算量随着token的个数的增阿吉呈现指数形式的增长!哈哈,可以,与文献中说的还真对上了),而利用了窗口计算之后,窗口与窗口之间不进行信息打扰,会降低计算量。

然后是说右边的表格在预训练与非与训练的事情。在上面学习vit的时候就说过,vit要想表现好必须要在一个大数据集上面进行训练才能有很好的效果,在表格的上衣部分很清晰的展示,如果vit不经过在22k上面预训练就直接用于1k的分类任务中可以发现vit的表现还不如之前学习的efficient,但即使没有与训练的swin就嫩更达到84.5,不逊于efficient。而下面的一部分就是在22k上面与训练之后的,可以发现之前的vit准确率明显上来了,达到了84,85.同样预训练之后的swin准确率也是更好达到了86.所以综上就是vit要预训练,还有就是swin效果确实不错!。

5接下来就是网络整体框架

首先是整体的描述:可以看到s1把特征图下采样了4倍(所以尺寸较大,但通道数少,即token_dim少,但是num_token的个数多),然后每经过一个s,就会把特征图的尺寸下采样两倍,但是特征图的通道数进行了翻倍的处理,这一点与cnn的特征图的变化规律基本一致,就是i你的特征图尺寸大,那通道数就应该少,特征图的尺寸小,那通道数就应该多,转到vit里面就是token的维度先小,但是数量多,然后后面维度大但是数量少。这里我纠正一下上面说的,其实12个TE之间的特征图的尺寸是不变的,因为12个TE都在一个S里面,特征图尺寸的变化就应该是S与S之间,这swin就相当于把TE步骤又进行了堆叠变成了一个个的S,但是上面那个用来理解vit与swin的不同之处也是没有问题的。

接着S1与S234的不同之处:就是S1在pp之后多了一个le,而其余的S都是pm操作,但是老师说了,pp+le的效果与后面的pm的效果是一样的。

先说一下pp是什么东西。主要就是上面的画的图。就是对一个3通道的输入图像(图里面虽然画的是4*4,这里假设是16*16)用4*4的窗口进行分割,所以分割后的16个窗口图片的尺寸就是4*4,通道数也是3,然后把16个窗口的图片在通道维度上进行一个拼接,所以拼接之后的特征图的通道总数就是16*3等于48,然后尺寸是4*4.所以模型中的[h/4,w/4,48]就是这样来的。(其实我觉得这个操作也可以i用一个卷积层来实现,卷积核的个数是48,然后尺寸是4*4,步长也是4=每个path的尺寸)

接下来是le层:主要作用就是对48通道数进行调整,通道数由48变为C,C具体等于多少其实是一个超参数,是自己设定的。也要注意le层中也有一个layernorm的操作。(这不也是可以用卷积来实现吗?直接1*1或者3*3然后卷积核的个数就等于C不就行了?)所以经过pp+le之后的图像尺寸变为[h/4,w/4,C],老师也说了pp+le的操作就是通过一个卷积层来实现的:k_s=4*4,s=4,通道数等于C。这其实就是用vit中的embedding的操作实现窗口的创建。只不过没有直接把每个窗口进行展平为token,而是在再把每个窗口的小图像再单独当成输入图像进行embedding,有点像套了一层娃的意思。

接下来说的是每个S中的STB,每个STB重复的次数都是偶数倍,,而每一个block的结构就是右边的图所示,包含两个小block,其实两个小block的结构与vit中的结构是一样的,不同就是把原来的多头自注意力MSA换成了W_MSAh和SW-MSA而已,这样算下来一个S中就是两个小block重复两次,共计4个小block。

上图展示的是swin的主要结构,如果应对不同的任务后面还会添加不同的结构,比如分类任务在S4后还会加上一个自适应池化,layernorm,全连接层等。好理解。

5patch_merging的操作讲解。

这个pm的作用就是下采样的作用,经过pm之后特征图的高和宽都会变为原来的一半,通道数会进行一个翻倍为2C。

总体过程是这样的:以单通道的中间层特征图为例,把输入特征图分为四个模块,图中以4*4为例,然后把四个模块中相同位置的像素点(注意老师说的是像素点)都给拿出来组成四个小特征矩阵,然后把小特征矩阵在通道方向继续宁一个拼接,所以到这一步特征图的尺寸就是通道数变为4倍,但是尺寸减半,然后经过一个leyernorm,送一个线性映射,注意这个全连接的线性映射是在通道维度上进行一个全连接,把4通道的转为2通道的,所以最终特征图的尺寸就是通道数翻倍,然后尺寸减半。

有留言说这个和yolov5的focus结构很像,听名字就知道这应该是一个注意力的模块,然后为什么不用一个卷积进行实现呢?肯定是这样处理后的效果比卷积的效果好,你都能想到,那些大佬会想不到?

总体来说pm还是挺简单的。

6之后是W-MSA模块。

这个与之前说的多头注意力的不同就是他把输入分为了很多个窗口,在每个窗口内部进行多头注意力的计算,图中是分为4个窗口为例子。之前的MSA是把输入a12组成的[197,768]矩阵中的所有的像素都进行了一个信息融合(qkv计算),所以计算量通常很大。W-MSA分窗口的作用就是减少计算量,但是窗口与窗口之间没有信息交流,所以导致计算的感受野变小,无法观察全局的变化,这肯定是会对最后的分类结果产生一定影响的。

下面说MSA与W-MSA的理论计算量对比。

M是分成的窗口大小:7*7,在特征图的尺寸为112时候,相比之下W-MSA确实可以省下很多的计算量,公式是怎么来的,先不说。所以从这里可以看出,W-MSA在应对比较大的中间层特征图的时候(回想一下,浅层特征图都是i通道数较少,但是i尺寸很大,对应vit中的理论就是这个时候token的维度较小,但是token的数目很多,正好又对应论文话题vit的计算量随着token的个数的增多指数型的增长,这些就是一说就立马想起来)确实很有优势!

下面就说一下计算量公式。

(博文:Swin-Transformer网络结构详解_swin transformer-CSDN博客)

首先看一下MSA的计算量:

对于两个矩阵A=[a,b],B=[b,c],则矩阵乘法AB的计算量为:abc

对于文中的A=[hw,c]是这样理解的:首先把vit和swin放在同一个维度上来说中间层的特征图的尺寸为[c,h,w]然后转化为vit中的输入a12矩阵就是[hw,c],别忘了,生成的中间层特征图的尺寸就是token的个数即hw,也即[197,768]中的197(高度维度),而每个token的维度,这文章中说了就假设每个token的维度(即embedding中卷积核的个数不一定就是768,也可以是别的这里就假设为特征图的通道数c),所以每个tokken的维度就是C,所以输入的a12的尺寸就是a=[hw,c]没毛病。

假设一个头(老师验证过,分为多个头的计算量和单头的计算量仅仅是多在最后的融合矩阵Wo上面,剩下的计算量完全一致,所以这里面用一个头就可以表示多头注意力的计算量),先生成qkv的矩阵就是3*hw*c*c,加上最后的信息融合Wo就是4*hw*c*c。然后是qk的匹配计算:[hw,c]*[c,hw]=(hw)²c,这里面除以根号d和softmax的计算量被忽略。然后是与v的注意力融合:[hw,hw]*[hw,c]=(hw)²c。所以一共就是:4hwc²+2(hw)²c。

然后换到W-MSA中的计算量:

每个窗口的大小是M*M,然后在窗口内部进行多头子注意力的计算,所以对于一个窗口来说就是把hw替换为M²,即:4M²c2+2M^4c.重点是有多少个窗口,分窗口和分path的计算方法一样:分的窗口的个数就是(h/M)*(w/M).窗口个数与上面的相乘就得到了:4hwc²+2M²hwc。

所以总之就是分为了窗口之后计算量减少了很多。

7SW-MSA讲解——窗口偏移的多头注意力机制

这个可以移动的窗口的设计的目的是为了增加W-MSA中的不同窗口之间无法进行信息交互的问题,具体的做法是:把每个窗口同时向右和向下移动一定的像素值(老师说的是移动两个像素单位),然后原来的4个窗口就变成了9个窗口不过这九个窗口的形状不太一样,这样对九个不同的窗口之间进 行多头注意力的计算就会同时融合W-MSA中四个窗口的信息,这就达到了信息融合的目的。所以在结构图中的每一个S中的每一个block里面就既包含了W-MSA也包含了SW-MSA,你上一层用W-MSA窗口进行计算,那下一层就必须用SW-MSA进行信息融合,所以他俩必须放在一起使用。

但是因为新建的9个窗口的大小不一样,如果还想使用并行计算就必须把剩下的周边8个窗口进行像素填充为4*4大小,才能对9个同样大小的窗口进行并行计算,不过你原来是计算了4个窗口,这下子变成了计算9个窗口,这计算量不就上去了嘛?怎么办呢?作者提出了一种新的更高效的计算方法:,就是图四。

首先,先把按照规定的像素值来挪动不同的窗口(这个挪动的像素数是通过窗口大小除以2向下取正来确定,图中的窗口M=4,所以例图中展示就是移动了两个像素值的单位,而例图正好尺寸是8*8,所以正好移动的区域与窗口的大小匹配重合,但实际上要知道,移动的像素单位是通过计算得到的,肯定不会与九个窗口正好匹配,即窗口的重新划分和移动的像素单位是两个独立的步骤) ,把上面像素单位(几个像素由M/2取整而得)个区域先移到最下面,然后把左边像素单位个区域一种到最右边就组成了图中的新特征图。然后把新特征图按照上一层(S-MSA)的窗口数进行划分后使用多头注意力计算(老师重新圈的四个窗口),这样对这些窗口的计算就融合了S-MSA中不同区域的信息,这样计算的依旧是4个窗口的计算量,但是完成了重新划分的九个窗口的计算。可是这样也是面另一个问题:就是重现划分的四个窗口虽然都融合了上一层(W-MSA)中不同区域的信息,但是如果你就对这4个窗口直接简单粗暴的采用多头注意力的计算你会发现,对于第一个窗口的图还好,因为它里面的区域本来就是连续的,可以对于第234个窗口,它里面的区域是不连续的,只是被你强行划分到一个区域里面了,你再按照多头注意力的方式为这样的窗口分配注意力是有问题的!我们希望在第二个窗口中的区域3和区域5进行单独的注意力计算,怎么解决?文中提出了一种mask的方法:

假设这个就是第二个窗口,左边是区域5,右边是区域3,根据之前学习的MSA注意力计算:特征图的尺寸就是像素的个数,也是token的个数也就是a12的高度维度,每一个token都会生成一个qkv,所以qkv矩阵的高度维度就等于像素的个数等于token的个数,所以qk匹配之后的权重[hw,hw]也是hw个,所以就像老师说的每个像素点都会通过qk匹配之后与其他像素(包括本身,图中的示例就是a0这个像素与16个像素生成的权重)匹配生成一个权重(就是图中的a00,01...然后这16权重就是[hw,hw]中的一行!然后所有的都匹配完毕之后就会生成[hw,hw]大权重矩阵进行并行计算) 然后经过softmax处理之后与v相乘再次得到[hw,c]。这里面为了把区域5和区域3分开来算,把a0与所有的区域3的像素匹配得到的权重都减去100,这样经过softmax处理之后的对应新权重的值就几乎为0,所以就变成了只对区域5进行加权计算,而区域5本来就是一个连续的区域,所以这样的权重相乘是符合逻辑的。同样的,在对区域3的v进行加权的时候也是把区域5的减去了100,这就把区域5和区域3分割开了。这里面注意区域5和区域3的计算是同时的,所以这样下来的计算量与一个单独的窗口的计算量是一样的,但是达到了把区域分开进行加权的目的和效果。

我大概理解这样的是什么情形了,就是权重与信息进行加权的时候是[hw,hw]*[hw,c],就是权重矩阵的每一行乘以v的每一列,为v中的每一个像素进行权重的分配,而[hw,hw]中的右半部分(区域3对应的权重),也不能说是右半部分,他英阿盖i是间隔的条状,因为a00-15是按照顺序展平的,所以区域3的位置对应的权重就是i间隔的,总之这些条状对应的区域3的权重都变为了0,所以区域3对应的位置就相当于没有进行权重的加权计算,这样就把区域3,5分开了。对于区域3计算的时候也是同理。这两个应该是并行计算的(看代码主要看这个并行计算的方法是如何实现的)。哦也不对,确实应该是进行了两次的计算。不过每一次权重加权计算的时候就只对一半的像素进行加权计算,就相当于吧原来的一部大计算才分为了两部计算量减半的小计算,所以计算量还是不变的。所以就是会进行两次权重匹配的计算:当对区域5计算的时候3的权重为0,但是计算量只有一半的像;对区域3进行计算的时候,区域5的权重为0,计算量也是一半,两个一半的计算量加在一起就是计算量没变。我懂了,我下面的问题得到了解决。

这里面我的问题是:你说对区域5计算的时候区域3的权重为0,反之也是,那不就是相当于权重与信息v要乘两次?还是说会有一个操作就是在区域5计算的时候3区域为0,反之也是。这个操作必须要看代码了解了,先不着急。先看懂知识再说。

最后注意全部计算完毕之后还要把移动的区域换回原来的位置,即再向左和向右移动回原来的位置。这样就可以回到原始图像的数据排序。

下面老师又说了一个例子用来理解:

左边是上一层的MSA模块的输出特征矩阵,还是正常的分割。然后右边是下一层移动窗口并且进行区域移动后的结果。可以看到移动窗口还是向下向右移动两个像素单位,但是移动区域的像素单位是通过M/2取整得到的,左移移动的是一行的像素单位,最终变成右图的形式。其中最后的分割线还是上一层W-MSA输出的特征图的分割线。在移动区域之后的右图中继续进行3*3的分割。

黄色的新窗口可以直接进行MSA计算,因为它本来就是一个连续的区域,但是紫色的新窗口就要用到上面的msak操作了,为不同的区域进行权重变0的操作。而且对新的窗口比如第一个窗口计算就相当于对上一层的四个窗口进行计算,这就达到了信息融合的目的,而下面进行像素移动和mask的操作的目的是为了使得在生成新窗口的同时不会增加计算量。所以经过这样的操作之后,就是即信息融合了又不会增加计算量。

(这样来看第一层的W-MSA的目的就是为了减少计算量。第二层的SW-MSA是为了融合有用信息并且防止窗口数增多而引起的计算量增多),我感觉这样进行信息融合的效率好像也不是很高,因为只是移动了很少一部分的像素点,大部分的像素点还是在黄色的新窗口中进行计算的。

这个SW-MSA的步骤我理解了,但是这样做的原理暂时没有太明白。就是如果我可以通过移动(M/2个)像素来进行信息融合,那我还进行窗口的shift(就是把原来的窗口整体向右下移动两个像素单位干嘛)

好吧我懂了,这两个步骤本来激素和i一个步骤!,正是因为我把上面[M/2]行的像素移动到最下面,然后再把[M/2]列的像素移动到最右边,再重新划分窗口进行MSA计算,才造成了把原始窗口整体“向下向右”移动[M/2]个像素单位的现象!所以SW-MSA的计算步骤就是:先移动[M/2]个像素,再重新划分窗口,再进行mask的计算,再把mask计算后的区域回到原来的像素位置以保证像素的连续性。我终于懂了哈哈哈。代码放在下一节再去理解。

8下面是介绍相对位置偏置。

第一先说是引入相对位置偏置的效果。如果像vit中引入绝对位置编码信息,发现在图像分类的数据上面确实有小幅度的提高,但是在目标检测的任务上面确实不行的,而换位相对位置偏置后发现在不同的任务上面都有不错的效果,所以说因为相对位置偏置还是有效果的。

第二再说第二层SW-MSA引入的有效性,因为滑窗的效果在三个任务上都有不错的提升,说明在第一层的W-MSA后面引入SW-MSA使得不同的窗口之间进行信息交互还是非常有必要的。

那究竟什么是相对位置偏置或者说相对位置偏移(就是公式中的B)呢?还有公式中的B是哪里来的呢?下面来说,有点小复杂,我慢慢理解,SWIN确实复杂度挺高。

假设输入特征图是2*2=4大小(这里面你的脑袋要时时刻刻想着,特征图的尺寸就是hw,就是token的个数,特征图的通道数这里面假设是1,所以每个token的维度就是1,所以A=4*1=hw*c),先标注它的绝对位置索引,对于蓝色像素就是第一行第一列,所以是(0,0),剩下的三个同理:第一行第二列;第二行第一列;第二行第二列。第一个数字对应的是行,第二个数字对应的是列。

下面是相对位置索引。首先把蓝色对应的像素点的q与所有位置的像素点的k进行匹配的得到大权重矩阵[hw,hw]=[4,4]中的第一行,然后把蓝色的像素点当作参考点(0,0),对应的橙色的像素点的索引就是蓝色的绝对索引减去橙色的绝对索引,所以得到的就是第一个图。下面把橙色当成参考点,那橙色的位置就是(0,0),所以蓝色就变成了(0,1)因为橙色的绝对索引(0,1)减去蓝色的相对索引(0,0)就等于(0,1).接下来的红色和绿色同理。每一个都可以生成一行权重四维向量,所以把这四个拼接到一起就是[4*4]的权重大矩阵。

但是这里面又有一个问题就是在第一个以蓝色为参考点中,右边是橙色的相对索引是(0,-1),可是在第三个红色为参考点中,右边的绿色的相对索引也变成了(0,-1),这样这两个位置的相对位置索引就一样了。这就没法体现位置编码了。注意这里面的相对位置索引与图中的大标题相对位置偏置(也就是公式中的B)不是一个东西,我们最后是要根据这个相对位置索引(二元数)去查表才能得到相对位置偏执B的值。每一个相对位置索引都可以通过查表得到其对应的B。

但是作者并不是用这种二元位置坐标来便是相对位置索引,而是一元位置坐标,那如何才能把这里面的二元位置坐标转换为1元?直接把行索引和列索引加到一起不就行了?不行啊,你就看[hw,hw]中的第一行的第二和第三个权重,他俩相加的结果都是-1,这就一样了就是对应同一个位置了,但明显是不同的位置啊,所以直接相加是有问题的。

作者用的方法就是:先让相对索引的偏移从0开始,就是把所有的行和列的索引都加上M-1,M是窗口的大小,例子中的窗口大小是2*2,就是像vit一样把一个图片整体当作一个窗口,没毛病。索引都加上M-1之后就变成了右边的矩阵。

接下来再在行标上面乘以2M-1=3,所以得到右边的矩阵。

再把行列相加就得到了右边的一元位置坐标的相对位置索引。这样变换之后可以发现两个问题。

第一到底什么叫做相对位置索引:按照最上面的第一个图的四个小的相对位置矩阵来说,比如第一个以蓝色为参考点的小矩阵中,橙色的像素点在它的右边,橙色的相对位置索引是(0,-1),那就得到一个信息,如果一个像素点的相对位置索引是(0,-1),就是表示这个点在参考点的右边。同理在以橙色为参考点的第二个小矩阵中,蓝色在橙色的左边,蓝色的相对位置索引是(0,1),那就得到一个信息,如果一个像素点的相对位置索引是(0,1),那这个像素点就在参考点的左边。剩下的同理是,如果一个像素点的相对位置索引是(1,0)和(-1,0),那这个像素点就在参考点的上面和下面,(1,1)(1,-1)(-1,-1)(-1,1)则是表示的距离最远的信息,所以[hw,hw]的权重矩阵中的每一行都是表示的与参考点的相对位置。比如4*4的矩阵中第一行第二列的(0,-1)和第三行第四列的(0,-1)的意思都是这一个点在蓝色/红色的右边。这就是相对位置信息的含义。而经过上面的变换后就是:3代表这个像素点在参考点的右边,1代表是下面,0代表是相对最远的位置..所以经过这样的变化后表示相对位置的信息还是不变的。

第二是之前说的二元数直接相加为一元数来表示位置信息的(0,1)和(1,0)相加都是1的问题也得到了解决。以上就是作者把二元坐标转换为一元坐标的过程。而新生成的一元位置坐标就是用来查表的索引值。

然后根据每个位置的一元索引取对应位置的参数就可以生成最后的相对位置偏置B,这才是要在公式里面相加的偏置矩阵它的尺寸也是[hw,hw],与qk匹配之后的权重矩阵是一样的尺寸。也就是说在训练网络的时候,真正训练的就是这个参数表,因为一旦窗口固定,生成的相对位置索引就是固定的,因为位置就在哪里摆着不会变,但是B的来源是查表中的数值,所以参数表中的数值是需要进行训练的。参数表在代码里面应该就是一个可训练的参数。

这个偏置表里面的元素的个数等于(2M-1)²,为什么是这么多?

先看最上面的那个4*4的二元数权重矩阵,最小,最极端的数字分别是1和-1,所以索引值的变化范围是(-1,1)所以转换为M的话就是二元位置坐标的索引值的变化范围是[-M+1,M-1],那中间有M-1-(-M+1)+1=2M-1个数字,因为是两个端点都取到的,所以要加1,比如M=2的话即使示例中的-1,0,1就是有三个数字,当M=3的时候就是[-2,2],那就有(-2,-1,0,1,2)五个数字。这里面你要理解中间数字的个数代表什么?就是代表行索引的位置的元素的可能的个数,比如M=2的时候,那某一个位置的行索引就有三种可能,可能是-1,0,1,同理列索引也是这三种可能,所以经过排列组合后,[hw,hw]矩阵的一行的元素个数就有九种可能:(-1-1,-10,-11,0-1,00,01,1-1,10,11),而你每一个可能都在偏置表有一个供其查询对应,所以偏置表里面元素的个数就应该等于[hw,hw]矩阵每一行的元素排列可能性的个数。所以要计算偏置表中元素的个数就必须知道你的窗口大小。然后对应的关系就是(2M-1)*(2M-1)=行的可能性*列的可能性。转到一元坐标索引也是一样,只不过是把9中二元坐标索引用一元表示而已,但是可能性的个数不变,还是等于最开始的二元坐标索引的可能性的个数。好家伙我终于明白了!哈哈哈。

这个相对位置偏执B就相当于一个位置编码的信息,尺寸与QK匹配之后的权重矩阵的尺寸一样都是[hw,hw],为什么一样?是因为B就是从qk匹配之后的权重矩阵得到的!先把其进行绝对位置编码,再得二元坐标相对位置索引,再变成一元坐标相对位置索引,再进行查表得到相对位置偏执B。

9模型详细配置参数:

TSBL从做到右模型依次变大,最左边的是结构最简单的一个。

首先是经过一个4*4大小(把高和宽下采样四倍)的下采样和96通道数(就是通过lm转换后的特征图的通道数)的转换,这其实就是最开始说的pp+lm的操作,他和后面的2*2下采样的pm的作用都是一样的,对输入特征图进行尺寸减小,通道数增加的操作。紧接着是两个STB,窗口的大小是7*7,dim=96意思是通过这一个模块后输出的特征矩阵的通道数就是96,也是每个token的维度(我依然记得,特征图的尺寸对应着token的个数,特征图的通道数对应着token的维度),使用头的个数是3.

接下来的就是同理,可以看到维度数是在逐渐增加的,说明就是特征图的通道数在逐渐增加,但是尺寸越来越小,尺寸变得小了,但是你的窗口还是7*7不变,不就相当于path越来越大了。

(这让我想到最开始的那个图画的确实有问题,因为图的尺寸在一直变小,而窗口的大小确实不变,所以相对来说就是path在变得越来越大,而那个图里面的尺寸一直都是不变的,所以很容易误导了)

我的天哪,这代码不得老复杂了!啊啊啊,慢慢学习叭,结合代码再回头重新看,有不对的纠正过来就行了

202403.12补充:

1:滑窗的本意就是为了让不同的窗口之间增加信息交互,为什么滑动之后重新划分窗口又说不连续的区域如果强行放在一起当作一个窗口进行子注意力的计算是有问题的?

因为如果不用滑动窗口就无法掌握i一个图片的全局信息,全局信息指的是一个图片中的语义信息按照顺序来计算的。即使两块区域不相关或者说是不连续,也要算出来参数表示这两块地方是不连续的(不相关的),而不是直接不算了。不连续的模块中就不应该情形放在一起求子注意力,因为,这两块的语义信息是乱的,如果真的这样算了,那求到的权重系数是有问题的,并不是全局权重,会存在偏差。滑窗的目的其实就是为了把零散的九个窗口的甲酸合并到一起来减少计算量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值