class_docstr: Path Aggregation Network with CSPNeXt blocks.
  
  Args:
      in_channels (Sequence[int]): Number of input channels per scale.
      out_channels (int): Number of output channels (used at each scale)
      num_csp_blocks (int): Number of bottlenecks in CSPLayer.
          Defaults to 3.
      use_depthwise (bool): Whether to use depthwise separable convolution in
          blocks. Defaults to False.
      expand_ratio (float): Ratio to adjust the number of channels of the
          hidden layer. Default: 0.5
      upsample_cfg (dict): Config dict for interpolate layer.
          Default: `dict(scale_factor=2, mode='nearest')`
      conv_cfg (dict, optional): Config dict for convolution layer.
          Default: None, which means using conv2d.
      norm_cfg (dict): Config dict for normalization layer.
          Default: dict(type='BN')
      act_cfg (dict): Config dict for activation layer.
          Default: dict(type='Swish')
      init_cfg (dict or list[dict], optional): Initialization config dict.
          Default: None.
class_docstr_tok: ["Path","Aggregation","Network","with","CSPNeXt","blocks",".","Args",":","in_channels","(","Sequence","[","int","]",")",":","Number","of","input","channels","per","scale",".","out_channels","(","int",")",":","Number","of","output","channels","(","used","at","each","scale",")","num_csp_blocks","(","int",")",":","Number","of","bottlenecks","in","CSPLayer",".","Defaults","to","3.","use_depthwise","(","bool",")",":","Whether","to","use","depthwise","separable","convolution","in","blocks",".","Defaults","to","False",".","expand_ratio","(","float",")",":","Ratio","to","adjust","the","number","of","channels","of","the","hidden","layer",".","Default",":","0.5","upsample_cfg","(","dict",")",":","Config","dict","for","interpolate","layer",".","Default",":","`","dict","(","scale_factor=2",",","mode='nearest","'",")","`","conv_cfg","(","dict",",","optional",")",":","Config","dict","for","convolution","layer",".","Default",":","None",",","which","means","using","conv2d",".","norm_cfg","(","dict",")",":","Config","dict","for","normalization","layer",".","Default",":","dict","(","type='BN","'",")","act_cfg","(","dict",")",":","Config","dict","for","activation","layer",".","Default",":","dict","(","type='Swish","'",")","init_cfg","(","dict","or","list","[","dict","]",",","optional",")",":","Initialization","config","dict",".","Default",":","None","."]
code: def __init__(
      self,
      in_channels: Sequence[int],
      out_channels: int,
      num_csp_blocks: int = 3,
      use_depthwise: bool = False,
      expand_ratio: float = 0.5,
      upsample_cfg: ConfigType = dict(scale_factor=2, mode="nearest"),
      conv_cfg: bool = None,
      norm_cfg: ConfigType = dict(type="BN", momentum=0.03, eps=0.001),
      act_cfg: ConfigType = dict(type="Swish"),
      init_cfg: OptMultiConfig = dict(
          type="Kaiming",
          layer="Conv2d",
          a=math.sqrt(5),
          distribution="uniform",
          mode="fan_in",
          nonlinearity="leaky_relu",
      ),
  ) -> None:
      super().__init__(init_cfg)
      self.in_channels = in_channels
      self.out_channels = out_channels
  
      conv = (
          DepthwiseSeparableConvModule if use_depthwise else ConvModule
      )
  
      # build top-down blocks
      self.upsample = nn.Upsample(**upsample_cfg)
      self.reduce_layers = nn.ModuleList()
      self.top_down_blocks = nn.ModuleList()
      for idx in range(len(in_channels) - 1, 0, -1):
          self.reduce_layers.append(
              ConvModule(
                  in_channels[idx],
                  in_channels[idx - 1],
                  1,
                  conv_cfg=conv_cfg,
                  norm_cfg=norm_cfg,
                  act_cfg=act_cfg,
              )
          )
          self.top_down_blocks.append(
              CSPLayer(
                  in_channels[idx - 1] * 2,
                  in_channels[idx - 1],
                  num_blocks=num_csp_blocks,
                  add_identity=False,
                  use_depthwise=use_depthwise,
                  use_cspnext_block=True,
                  expand_ratio=expand_ratio,
                  conv_cfg=conv_cfg,
                  norm_cfg=norm_cfg,
                  act_cfg=act_cfg,
              )
          )
  
      # build bottom-up blocks
      self.downsamples = nn.ModuleList()
      self.bottom_up_blocks = nn.ModuleList()
      for idx in range(len(in_channels) - 1):
          self.downsamples.append(
              conv(
                  in_channels[idx],
                  in_channels[idx],
                  3,
                  stride=2,
                  padding=1,
                  conv_cfg=conv_cfg,
                  norm_cfg=norm_cfg,
                  act_cfg=act_cfg,
              )
          )
          self.bottom_up_blocks.append(
              CSPLayer(
                  in_channels[idx] * 2,
                  in_channels[idx + 1],
                  num_blocks=num_csp_blocks,
                  add_identity=False,
                  use_depthwise=use_depthwise,
                  use_cspnext_block=True,
                  expand_ratio=expand_ratio,
                  conv_cfg=conv_cfg,
                  norm_cfg=norm_cfg,
                  act_cfg=act_cfg,
              )
          )
  
      self.out_convs = nn.ModuleList()
      for i in range(len(in_channels)):
          self.out_convs.append(
              conv(
                  in_channels[i],
                  out_channels,
                  3,
                  padding=1,
                  conv_cfg=conv_cfg,
                  norm_cfg=norm_cfg,
                  act_cfg=act_cfg,
              )
          )
  
file_path: mmdetection/mmdet/models/necks/cspnext_pafpn.py
imports: import math
  from typing import Sequence, Tuple
  import torch
  import torch.nn
  from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule
  from mmengine.model import BaseModule
  from torch import Tensor
  from mmdet.registry import MODELS
  from mmdet.utils import ConfigType, OptMultiConfig
  from ..layers import CSPLayer
label_desc: Use image node_id 1 to create a new CSPNeXtPAFPN object from inherited base classes: BaseModule with example: obj = CSPNeXtPAFPN(in_channels, out_channels, num_csp_blocks, use_depthwise, expand_ratio, upsample_cfg, conv_cfg, norm_cfg, act_cfg, init_cfg)