Closed RandomCoins closed 1 year ago
attn = q @ k.transpose(-2, -1) * self.norm_fact attn = self.softmax(attn) x = (attn @ v).transpose(1, 2).reshape(B, C, N) x = self.proj_drop(x) x = x + _x 您好, 关于TABlock的代码,我理解attn的形状是(B, C, C),v的形状是(B, C, N),做完矩阵乘法之后的形状是(B, C, N),那这里为什么还需要使用transpose交换维度1和维度2,Swin Transformer代码中有这一步是因为使用了多头注意力,但您的代码中似乎并没有使用多头注意力。
attn = q @ k.transpose(-2, -1) * self.norm_fact
attn = self.softmax(attn)
x = (attn @ v).transpose(1, 2).reshape(B, C, N)
x = self.proj_drop(x)
x = x + _x
这两个本质区别是在输入不同,一个是以【B,N,C】作为输入,还有一个是以【B, C, N】作为输入,所以代码核心是一样的。
attn = q @ k.transpose(-2, -1) * self.norm_fact
attn = self.softmax(attn)
x = (attn @ v).transpose(1, 2).reshape(B, C, N)
x = self.proj_drop(x)
x = x + _x
您好, 关于TABlock的代码,我理解attn的形状是(B, C, C),v的形状是(B, C, N),做完矩阵乘法之后的形状是(B, C, N),那这里为什么还需要使用transpose交换维度1和维度2,Swin Transformer代码中有这一步是因为使用了多头注意力,但您的代码中似乎并没有使用多头注意力。