code: def __init__(
      self,
      in_channels,
      hidden_dim,
      output_channels,
      kernel_size,
      stride,
      use_se,
      lr_mult,
      conv_decay=0.0,
      norm_type="bn",
      norm_decay=0.0,
      freeze_norm=False,
      return_list=False,
      name=None,
  ):
      super(GhostBottleneck, self).__init__()
      self._stride = stride
      self._use_se = use_se
      self._num_channels = in_channels
      self._output_channels = output_channels
      self.return_list = return_list
  
      self.ghost_module_1 = GhostModule(
          in_channels=in_channels,
          output_channels=hidden_dim,
          kernel_size=1,
          stride=1,
          relu=True,
          lr_mult=lr_mult,
          conv_decay=conv_decay,
          norm_type=norm_type,
          norm_decay=norm_decay,
          freeze_norm=freeze_norm,
          name=name + "_ghost_module_1",
      )
      if stride == 2:
          self.depthwise_conv = ConvBNLayer(
              in_c=hidden_dim,
              out_c=hidden_dim,
              filter_size=kernel_size,
              stride=stride,
              padding=int((kernel_size - 1) // 2),
              num_groups=hidden_dim,
              act=None,
              lr_mult=lr_mult,
              conv_decay=conv_decay,
              norm_type=norm_type,
              norm_decay=norm_decay,
              freeze_norm=freeze_norm,
              name=name
              + "_depthwise_depthwise",  # looks strange due to an old typo, will be fixed later.
          )
      if use_se:
          self.se_block = SEBlock(
              hidden_dim, lr_mult, name=name + "_se"
          )
      self.ghost_module_2 = GhostModule(
          in_channels=hidden_dim,
          output_channels=output_channels,
          kernel_size=1,
          relu=False,
          lr_mult=lr_mult,
          conv_decay=conv_decay,
          norm_type=norm_type,
          norm_decay=norm_decay,
          freeze_norm=freeze_norm,
          name=name + "_ghost_module_2",
      )
      if stride != 1 or in_channels != output_channels:
          self.shortcut_depthwise = ConvBNLayer(
              in_c=in_channels,
              out_c=in_channels,
              filter_size=kernel_size,
              stride=stride,
              padding=int((kernel_size - 1) // 2),
              num_groups=in_channels,
              act=None,
              lr_mult=lr_mult,
              conv_decay=conv_decay,
              norm_type=norm_type,
              norm_decay=norm_decay,
              freeze_norm=freeze_norm,
              name=name
              + "_shortcut_depthwise_depthwise",  # looks strange due to an old typo, will be fixed later.
          )
          self.shortcut_conv = ConvBNLayer(
              in_c=in_channels,
              out_c=output_channels,
              filter_size=1,
              stride=1,
              padding=0,
              num_groups=1,
              act=None,
              lr_mult=lr_mult,
              conv_decay=conv_decay,
              norm_type=norm_type,
              norm_decay=norm_decay,
              freeze_norm=freeze_norm,
              name=name + "_shortcut_conv",
          )
  
imports: import math
  import paddle
  from paddle import ParamAttr
  import paddle.nn
  import paddle.nn.functional
  from paddle.nn import AdaptiveAvgPool2D, Linear
  from paddle.nn.initializer import Uniform
  from ppdet.core.workspace import register, serializable
  from numbers import Integral
  from ..shape_spec import ShapeSpec
  from .mobilenet_v3 import make_divisible, ConvBNLayer
label_desc: Use image node_id 1 to create a new GhostBottleneck object from inherited base classes: nn with example: obj = GhostBottleneck(in_channels, hidden_dim, output_channels, kernel_size, stride, use_se, lr_mult, conv_decay, norm_type, norm_decay, freeze_norm, return_list, name)