class_docstr: Vanilla self-attention
class_docstr_tok: ["Vanilla","self-attention"]
code: def forward(self, x):
      B, N, C = x.shape
      qkv = (
          self.qkv(x)
          .reshape(B, N, 3, self.num_heads, C // self.num_heads)
          .permute(2, 0, 3, 1, 4)
      )
      q = qkv[0]
      k = qkv[1]
      v = qkv[2]
  
      attn = (q @ k.transpose(-2, -1)) * self.scale
      attn = attn.softmax(dim=-1)
      attn = self.attn_drop(attn)
  
      x = (attn @ v).transpose(1, 2).reshape(B, N, C)
      x = self.proj(x)
      x = self.proj_drop(x)
      return x
  
imports: import copy
  import logging
  import math
  import torch
  import torch.nn
  from vissl.models.model_helpers import DropPath, to_2tuple, trunc_normal_
  from vissl.models.trunks import register_model_trunk
  from vissl.utils.hydra_config import AttrDict
label_desc: Use image node_id 4 for calling the SelfAttention obj's underlying member method code with example usage: obj.forward(x) and returns: x