class_docstr: Split-Attention Conv2d in ResNeSt.
  
  Args:
      in_channels (int): Same as nn.Conv2d.
      out_channels (int): Same as nn.Conv2d.
      kernel_size (int | tuple[int]): Same as nn.Conv2d.
      stride (int | tuple[int]): Same as nn.Conv2d.
      padding (int | tuple[int]): Same as nn.Conv2d.
      dilation (int | tuple[int]): Same as nn.Conv2d.
      groups (int): Same as nn.Conv2d.
      radix (int): Radix of SpltAtConv2d. Default: 2
      reduction_factor (int): Reduction factor of inter_channels. Default: 4.
      conv_cfg (dict): Config dict for convolution layer. Default: None,
          which means using conv2d.
      norm_cfg (dict): Config dict for normalization layer. Default: None.
      dcn (dict): Config dict for DCN. Default: None.
class_docstr_tok: ["Split-Attention","Conv2d","in","ResNeSt",".","Args",":","in_channels","(","int",")",":","Same","as","nn.Conv2d",".","out_channels","(","int",")",":","Same","as","nn.Conv2d",".","kernel_size","(","int","|","tuple","[","int","]",")",":","Same","as","nn.Conv2d",".","stride","(","int","|","tuple","[","int","]",")",":","Same","as","nn.Conv2d",".","padding","(","int","|","tuple","[","int","]",")",":","Same","as","nn.Conv2d",".","dilation","(","int","|","tuple","[","int","]",")",":","Same","as","nn.Conv2d",".","groups","(","int",")",":","Same","as","nn.Conv2d",".","radix","(","int",")",":","Radix","of","SpltAtConv2d",".","Default",":","2","reduction_factor","(","int",")",":","Reduction","factor","of","inter_channels",".","Default",":","4.","conv_cfg","(","dict",")",":","Config","dict","for","convolution","layer",".","Default",":","None",",","which","means","using","conv2d",".","norm_cfg","(","dict",")",":","Config","dict","for","normalization","layer",".","Default",":","None",".","dcn","(","dict",")",":","Config","dict","for","DCN",".","Default",":","None","."]
code: def forward(self, x):
      x = self.conv(x)
      x = self.norm0(x)
      x = self.relu(x)
  
      batch, rchannel = x.shape[:2]
      batch = x.size(0)
      if self.radix > 1:
          splits = x.view(batch, self.radix, -1, *x.shape[2:])
          gap = splits.sum(dim=1)
      else:
          gap = x
      gap = F.adaptive_avg_pool2d(gap, 1)
      gap = self.fc1(gap)
  
      gap = self.norm1(gap)
      gap = self.relu(gap)
  
      atten = self.fc2(gap)
      atten = self.rsoftmax(atten).view(batch, -1, 1, 1)
  
      if self.radix > 1:
          attens = atten.view(batch, self.radix, -1, *atten.shape[2:])
          out = torch.sum(attens * splits, dim=1)
      else:
          out = atten * x
      return out.contiguous()
  
imports: import math
  import torch
  import torch.nn
  import torch.nn.functional
  import torch.utils.checkpoint
  from annotator.uniformer.mmcv.cnn import build_conv_layer, build_norm_layer
  from ..builder import BACKBONES
  from ..utils import ResLayer
  from .resnet import Bottleneck
  from .resnet import ResNetV1d
label_desc: Use image node_id 4 for calling the SplitAttentionConv2d obj's underlying member method code with example usage: obj.forward(x) and returns: out