class_docstr: Custom sequential head that permute dimensions for variants of BN
  Credits goes to iBOT codebase:
  https://github.com/bytedance/ibot/blob/da316d82636a7a7356835ef224b13d5f3ace0489/models/head.py#L51
class_docstr_tok: ["Custom","sequential","head","that","permute","dimensions","for","variants","of","BN","Credits","goes","to","iBOT","codebase",":","https",":","\/\/github.com\/bytedance\/ibot\/blob\/da316d82636a7a7356835ef224b13d5f3ace0489\/models\/head.py","#","L51"]
code: def forward(self, x: torch.Tensor) -> torch.Tensor:
      for module in self:
          dim = len(x.shape)
          if isinstance(module, self.bn_types) and dim > 2:
              perm = list(range(dim - 1))
              perm.insert(1, dim - 1)
              inv_perm = list(range(dim)) + [1]
              inv_perm.pop(1)
              x = module(x.permute(*perm)).permute(*inv_perm)
          else:
              x = module(x)
      return x
  
file_path: vissl/vissl/models/heads/ibot_head.py
imports: from typing import Optional
  import torch
  import torch.nn
  from vissl.config import AttrDict
  from vissl.models.heads import register_model_head
  from vissl.models.model_helpers import trunc_normal_
label_desc: Use image node_id 1 for calling the CustomSequential obj's underlying member method code with example usage: obj.forward(x) and returns: x