(自用学习笔记)swin transformer

swin transformer和vit的对比

swin transformer是希望通过提取多尺度的特征,就像卷积神经网络一样,从图1可以看到,swin transformer和vit的区别,vit一上来就是对图像进行了16倍的下采样,后续的工作都是在这上面进行的,而swin transformer首先是进行了4倍的下采样,然后通过patch merging的方式实现4到8倍的下采样。得到多特征的好处是可以泛化到密集型的下游任务(物体检测,物体分割..),因为swin transformer是目的是作为一个通用的骨干网络。

图1 swin transformer和vit

swin transformer框架图

接下来看图2进行一次前向的过程,输入一张224*224*3的图片,然后进入patch partition(就是一次卷积),然后得到56*56*48(就是将4*4的小块拉直到了一个像素里面,4*4*3=48),然后经过一次线性层拉直得到3136*96(这里3136=56*56,96是这个网络预先设置好的)

图2 swin transformer的网络结构

上面是经过了stage1之后的结果得到了3136*96,就是3136个patch,然后维度是96,如果基于3136这个序列长度去计算注意力就太长了,所以swin transformer提出了基于窗口的自注意力,他们这里设置的窗口大小是7*7的就是49个patch,这样计算量就小很多了。

然后就是在这个swin block里面进行基于窗口的自注意力计算(留坑),然后transformer不会改变维度,所以出来之后还是56*56*96,然后因为作者希望像卷积神经网络一样得到多尺度的特征,那就需要去设计一个池化的操作(压缩特征图),所以这里有一个patch merging的操作。

图3 patch merging

从图3可以很直观的看到patch merging的操作就是隔一个位置拿一个像素出来(因为是想下采样2倍),一共是有4个编号,那这样的话原来一张图现在得到了4张图,那面积就被分成了4份,假设原来是H*W,现在就是H/2*W/2,通道数变为了原来的4倍,但是在卷积神经网络那边池化之后通道数只会变成2倍,所以这里采用1*1的卷积核(用2c个卷积核就好了)降维得到原来2倍的特征图。

回到前向的过程,刚刚得到了56*56*96的特征图,经过patch merging后就是28*28*192,然后都是一样的过程了,最后得到的是7*7*768的特征图,然后如果想做分类的话就用一个全局池化把7*7变成1,得到1*768,然后经过全连接层变成1*1000就可以去imagenet上面做分类任务了。

基于窗口的自注意力

首先来看看这样的计算方式会比全局的计算方式节省多少

图4 两种自注意力计算量公式

假设输入的是h*w个patch的图像,那全局的自注意力计算就是下面这样

首先图像乘qkv三个矩阵这里的计算量是3hwc^2,然后qk要做乘法就是(hw)^2c,然后vA要做乘法就是(hw)^2c,所以最后是3hwc^2+2(hw)^2c,然后这里最后还会有一步投射层就是b矩阵经过投射层投射到我们想要的那个维度就是hw*c*c*c,最后得到是4hwc^2+2(hw)^2c。

那基于窗口的自注意力计算就是把hw给换成窗口的大小就是m*m,代入刚刚计算的公式得到4(mc)^2+2m^4c,然后我们有hw/mm这么多个窗口,再做个乘法就可以得到公式2了,看起来可能没啥区别,但是实际代入数字会相差很大。

移动窗口

图5 移动窗口

分割的方式就是原来的大窗口往右下角移动两格,再平分。(埋坑)所以在block里面每次都是先做一次自注意力,然后再移动窗口再做一次,这样的好处就是可以使得窗口与窗口之间有交流了,所以每次block都是成对出现的。

移动窗口会导致的问题

首先就是窗口的数量会增加,而且大小不一。

解决方法就是把窗口互补一下,还是拼成原来的4个窗口,但是这样又会出现一个问题就是离得远的像素点其实是不应该做注意力计算的,那这里十分巧妙的给出了掩码的解决方法。

 下面介绍怎么设计掩码

拿左下角的窗口举例子,因为6是上面移下来的所以6的高是3,那3的高度就是4,因为一个窗口的大小是7*7的,然后从左到右从上到下的把向量取出来,然后再跟qk矩阵去乘,然后再拿得到的qk做乘法(图里简化了),得到最后的A矩阵,从这个矩阵可以看到只有33和66的区域是需要做自注意力计算的,那其他地方就用掩码盖住,像这样,在计算出来的注意力矩阵中加上这个掩码然后用softmax函数,那我们不感兴趣的区域就会变成0了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值