Q&A#

window partition 코드#

sepvit 코드에서 window partition을 수행하는 부분이 어디일까요…?

팀페이지 SepViT 페이지에 있는 SepViT Code 보시면 Transformer Module 중 DSSA라는 class가 있습니다. def forward의 x = rearrange(x, ‘b c (h w1) (w w2) -> (b h w) c (w1 w2)’, w1 = wsz, w2 = wsz) 부분에서 wsz가 window size이고 x를 rearrange해서 마지막 shape을 windowsize^2로 만들어주고 거기에 random initialize한 window_tokens를 concat합니다. 명확히 window partition 부분이 어디냐고 한다면 rearrange하는 부분이 아닐까 싶네요. 🙂

감사합니다. 😄 window partition이라는게 patch split과 어떤 부분이 다른 건지 모르겠습니다;; 굳이 window라고 명명한 이유가 혹시 뭐라고 생각하시나요?

본 논문에서 다른 종류의 ViT 모델과 patch split에 대해 자세히 설명하거나 window partition 개념과 비교하는 부분이 없어서 저도 이해하는데 좀 힘들었습니다 ㅠ 개인적으로 생각했을 때, feature map을 window로 나눠주고 각 window마다 learnable window token을 부여함으로써 within window, among window information interaction을 동시에 나타내기 위함이지 않을까 싶습니다.

흠… feature map 을 뽑아서 나누느냐 나누고나서 feature map을 뽑느내의 차이라고 해야할까요…?

window partition의 경우 overlapping patch embedding과 positional encoding generator를 거친 후 feature map을 형성시킨 상태에서 window를 나누게 됩니다. 이 상태에서 window token을 부여하고 feature map을 뽑아내는 작업을 반복합니다. patch split의 경우엔 input 자체를 patch로 나눠주고 patch 간의 self-attention을 통해 feature map을 뽑아내게 되죠. 이 차이가 아닐까요? 제가 이해한게 맞는지도 의구심이 드네요 ㅋㅋ


Edit by 김주영