- V-MSA计算方法
图片 1转载自:https://zhuanlan.zhihu.com/p/408333152 V-MSA计算方法
主要计算代码在SwinTransblk类:
1)输入x(B,DHW,C)=(1,48,32,32,192)
2)创建三个pad feature maps
pad_r = (self.window_size - W % self.window_size) % self.window_size #0
pad_b = (self.window_size - H % self.window_size) % self.window_size
pad_g = (self.window_size - S % self.window_size) % self.window_size
3)x = laynorm(x)且x.view(B, S, H, W, C)
4)使用F.pad()方法扩充tensor维度
原:torch.nn.functional.pad(input, pad, mode=‘constant’, value=0)
x = F.pad(x, (0, 0, 0, pad_r, 0, pad_b, 0, pad_g)) #x为需要扩充的tensor,(0, 0, 0, pad_r, 0, pad_b, 0, pad_g)为扩充维度
这里扩充的维度为0,因此x.shape=(1,48,32,32,192)
5)#划分窗口
x = x.view(B, S // window_size, window_size, H // window_size, window_size, W // window_size, window_size, C) #x.shape=(1,12,4,8,4,8,4,192)
#调换维度顺序x.shape=(1,12,8,8,4,4,4,192)#1288=768, 76864=4832*32=49152
6)再次更改维度
x_windows = x_windows.view(-1, self.window_size * self.window_size * self.window_size,C)
x_windows.shape=torch.Size([768, 64, 192])
7)进行V-MSA/SV-MSA计算
attn_windows = self.attn(x_windows, mask=attn_mask)#attn_mask=None #torch.Size([768, 64, 192])
8)将窗口大小的维度弄出来
attn_windows = attn_windows.view(-1, self.window_size, self.window_size, self.window_size, C)
#torch.Size([768, 4, 4, 4, 192])
9)window_reverse:将图像的维度转为一开始输入的
shifted_x.shape:torch.Size([1, 48, 32, 32, 192])
V-MSA和SV-MSA计算时维度不变,只是多计算了一个Transformerblock



