SwinTransformer源码调试

为了了解源码的主要工作内容在SwinTransformer中Forward函数打上断点。

可能好奇为什么在这个类,首先我们找到入口函数按住ctrl点击main函数,进入到对应函数中,可以发现前几行都是读入数据以及模型导入

点击上述的build_model进入相应函数,可以发现主要函数为SwinTransformer

图像数据和patch编码

在此函数的forward函数处打上断点。进入debug模式。其中x为batch数据为4,输入值如下对应B,C,H,W

第一步先做patch_embed,跳入这个函数,如何找到这个函数和上述SwinTransformer的寻找一致,都在对应的构造函数上。在此函数的forward函数打断点。如下图所示。

x = self.proj(x).flatten(2).transpose(1, 2)这个操作是得到每个patch,每个patch对应某个编码,通过卷积得到特征图,特征图多块,每块对应向量。输入3通道,输出96维度,每个小序列的元素是96维向量。得出x为(4,3136,96)分别为batch、224/4*224/4=3136(这里的4是卷积核大小)相当于一共又56*56个点、每个点中是96维度向量。

数据按window进行划分计算

进入layer层,要想知道layer函数需看上方的构造函数

点进BasicLayer函数在forward中打上断点,继续跳入,面对不同的block要进行不同的操作

看其构造函数,并在对应的SwinTransformerBlock打上断点。

进入Block函数,先进行基于窗口的注意力机制。

window_paritition是序列到窗口的转换,输入特征图为(56,56,96)默认窗口大小为7,所以总共可以分成8*8个窗口,输出特征图为(64,7,7,96)

输入的x为(4,3196,96)经过x.view(B=4, H//window_size=56/7=8, widow-size=7, w//window_size=8, window_size=7, c=96),经过windows得到维度为(256,7,7,96)其中256是4个batch中每个有56/7=8,8*8=64个窗口,4个batch, 4*64=256个窗口。7,7是window_size每个窗口大小都是7*7,每个点是96维度向量。3196个元素直接做attention效率太低,因此划分窗口,一共为256个窗口进行attention。每个窗口一共有7*7=49个元素。

基础attention计算模块

回到Block函数,先进行W-MSA,基于窗口的注意力机制

进入对应的构造函数知道attn是WindoeAttention,进入对应函数打断点。

结果为(3,256,3,49,32)分别代表(矩阵个数qkv3个,256个窗口分别做attention,3个头,每个窗口一共有49个元素,96维度向量一共3头所以除以3为32),再通过索引取出。进行attn计算,q*k,attn计算结果维度为(256,3,49,49),再进行position_encoding,加入位置编码

窗口维度转换从(4,8,8,7,7,96)转换为(4,56,56,96)方便下次attention计算。

窗口位移模块细节分析

走完w-msa的block该进行,sw-msa的block,进行位移窗口注意力机制。再次进入TransFormerBlock,可以发现此时shift-size不为0而是为3.

这里的shift_size要和窗口大小进行适配,这里选用默认的数值3。位移就是像素点的偏移。用torch.roll执行偏移后的结果,指定了dims=(1,2)两个维度,即上面到下面,左边到右边。

继续做窗口划分,进行attn,此时含有mask参数。位移之后,计算时只需要计算自己窗口的,其他无关的都mask掉。不需要的值设置为-100

patchmerge下采样操作

走完block后进入PatchMerging操作

PatchMerging操作如下

间隔去选,把每个特征点取出,得到下采样,最后特征图为28*28。

进入STAGE2。再划分窗口,窗口大小为7*7,所以未28/7=4,就是每个窗口为4*4,4个batch,4*4*4=64,总共为64个窗口,每个stage的多头头数不一样,会逐步增加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值