code: def __init__(
      self,
      in_c: int,
      out_c: int,
      stride: int = 1,
      group_width: int = 1,
      se_ratio: float = 0.0,
      drop_ratio: float = 0.0,
  ):
      super(Bottleneck, self).__init__()
  
      self.conv1 = ConvBNAct(in_c=in_c, out_c=out_c, kernel_s=1)
      self.conv2 = ConvBNAct(
          in_c=out_c,
          out_c=out_c,
          kernel_s=3,
          stride=stride,
          padding=1,
          groups=out_c // group_width,
      )
  
      if se_ratio > 0:
          self.se = SqueezeExcitation(in_c, out_c, se_ratio)
      else:
          self.se = nn.Identity()
  
      self.conv3 = ConvBNAct(
          in_c=out_c, out_c=out_c, kernel_s=1, act=None
      )
      self.ac3 = nn.ReLU(inplace=True)
  
      if drop_ratio > 0:
          self.dropout = nn.Dropout(p=drop_ratio)
      else:
          self.dropout = nn.Identity()
  
      if (in_c != out_c) or (stride != 1):
          self.downsample = ConvBNAct(
              in_c=in_c,
              out_c=out_c,
              kernel_s=1,
              stride=stride,
              act=None,
          )
      else:
          self.downsample = nn.Identity()
  
imports: from typing import Optional
  import numpy
  import torch
  import torch.nn
  from torch import Tensor
label_desc: Use image node_id 1 to create a new Bottleneck object from inherited base classes: nn with example: obj = Bottleneck(in_c, out_c, stride, group_width, se_ratio, drop_ratio)