Sense-X / UniFormer

[ICLR2022] official implementation of UniFormer
Apache License 2.0
828 stars 111 forks source link

Multi-head in video #74

Closed LEM0NTE closed 2 years ago

LEM0NTE commented 2 years ago

您好,在后两个stage中,即Global MHRA中您近乎是使用了video transformer的架构。但我注意到,当切分multi-head时,您的设置与timesformer的joint space-time的一样。即 Channel//head。最后计算attention的维度为[B, TxHxW, 3, num_heads, channel // num_heads] image 而原始的ViT则是计算了N = HxWxC,然后令 N//head。计算attention的维度为[B, num_heads, num_patchs+1, HxWxC // num_heads] 请问为什么会有这样不同的设计呢。即Global为什么不是 TxHxW // num_heads呢?

Andy1621 commented 2 years ago

请问能否提供原始ViT的代码呢?从我了解的Attention里,head都是针对channel分组的概念,没有在空间维度进行拆分的。timm中实现的vit也是如此 https://github.com/rwightman/pytorch-image-models/blob/c45c6ee8e406861898acccb1818f91d0c9240e48/timm/models/vision_transformer.py#L200-L202

LEM0NTE commented 2 years ago

请问能否提供原始ViT的代码呢?从我了解的Attention里,head都是针对channel分组的概念,没有在空间维度进行拆分的。timm中实现的vit也是如此 https://github.com/rwightman/pytorch-image-models/blob/c45c6ee8e406861898acccb1818f91d0c9240e48/timm/models/vision_transformer.py#L200-L202

您好,根据ViT原文的表述,显然生成的token向量长度D是相关与(P^2xC)的。即我在问题中提出的HxWxC。接下来按head对该维度切分,就得到了P^2xC // head。此外,对于ViT处理原始图片来说,RGB图片channel数为3,也无法切分到多个head去了呀。另外我查看了您提供的链接,的确如您所说,并且与Timesformer的设置一样,是channel // head。 但是我在github上找到了另一个pytorch版本的ViT代码,如下,请您参考: https://github.com/lucidrains/vit-pytorch/blob/main/vit_pytorch/vit.py#:~:text=qkv%20%3D%20self,)%2C%20qkv) image

LEM0NTE commented 2 years ago

哈哈太尴尬了,看懂了,本质是一样的,只是不同的写法,我把这个issue关啦