code: def residual_unit(
      data,
      num_filter,
      stride,
      dim_match,
      name,
      bottle_neck=True,
      num_group=32,
      bn_mom=0.9,
      workspace=256,
      memonger=False,
  ):
      """Return ResNet Unit symbol for building ResNet
      Parameters
      ----------
      data : str
          Input data
      num_filter : int
          Number of output channels
      bnf : int
          Bottle neck channels factor with regard to num_filter
      stride : tuple
          Stride used in convolution
      dim_match : Boolean
          True means channel number between input and output is the same, otherwise means differ
      name : str
          Base name of the operators
      workspace : int
          Workspace used in convolution operator
      """
      if bottle_neck:
          # the same as https://github.com/facebook/fb.resnet.torch#notes, a bit difference with origin paper
  
          conv1 = mx.sym.Convolution(
              data=data,
              num_filter=int(num_filter * 0.5),
              kernel=(1, 1),
              stride=(1, 1),
              pad=(0, 0),
              no_bias=True,
              workspace=workspace,
              name=name + "_conv1",
          )
          bn1 = mx.sym.BatchNorm(
              data=conv1,
              fix_gamma=False,
              eps=2e-5,
              momentum=bn_mom,
              name=name + "_bn1",
          )
          act1 = mx.sym.Activation(
              data=bn1, act_type="relu", name=name + "_relu1"
          )
  
          conv2 = mx.sym.Convolution(
              data=act1,
              num_filter=int(num_filter * 0.5),
              num_group=num_group,
              kernel=(3, 3),
              stride=stride,
              pad=(1, 1),
              no_bias=True,
              workspace=workspace,
              name=name + "_conv2",
          )
          bn2 = mx.sym.BatchNorm(
              data=conv2,
              fix_gamma=False,
              eps=2e-5,
              momentum=bn_mom,
              name=name + "_bn2",
          )
          act2 = mx.sym.Activation(
              data=bn2, act_type="relu", name=name + "_relu2"
          )
  
          conv3 = mx.sym.Convolution(
              data=act2,
              num_filter=num_filter,
              kernel=(1, 1),
              stride=(1, 1),
              pad=(0, 0),
              no_bias=True,
              workspace=workspace,
              name=name + "_conv3",
          )
          bn3 = mx.sym.BatchNorm(
              data=conv3,
              fix_gamma=False,
              eps=2e-5,
              momentum=bn_mom,
              name=name + "_bn3",
          )
  
          if dim_match:
              shortcut = data
          else:
              shortcut_conv = mx.sym.Convolution(
                  data=data,
                  num_filter=num_filter,
                  kernel=(1, 1),
                  stride=stride,
                  no_bias=True,
                  workspace=workspace,
                  name=name + "_sc",
              )
              shortcut = mx.sym.BatchNorm(
                  data=shortcut_conv,
                  fix_gamma=False,
                  eps=2e-5,
                  momentum=bn_mom,
                  name=name + "_sc_bn",
              )
  
          if memonger:
              shortcut._set_attr(mirror_stage="True")
          eltwise = bn3 + shortcut
          return mx.sym.Activation(
              data=eltwise, act_type="relu", name=name + "_relu"
          )
      else:
          conv1 = mx.sym.Convolution(
              data=data,
              num_filter=num_filter,
              kernel=(3, 3),
              stride=stride,
              pad=(1, 1),
              no_bias=True,
              workspace=workspace,
              name=name + "_conv1",
          )
          bn1 = mx.sym.BatchNorm(
              data=conv1,
              fix_gamma=False,
              momentum=bn_mom,
              eps=2e-5,
              name=name + "_bn1",
          )
          act1 = mx.sym.Activation(
              data=bn1, act_type="relu", name=name + "_relu1"
          )
  
          conv2 = mx.sym.Convolution(
              data=act1,
              num_filter=num_filter,
              kernel=(3, 3),
              stride=(1, 1),
              pad=(1, 1),
              no_bias=True,
              workspace=workspace,
              name=name + "_conv2",
          )
          bn2 = mx.sym.BatchNorm(
              data=conv2,
              fix_gamma=False,
              momentum=bn_mom,
              eps=2e-5,
              name=name + "_bn2",
          )
  
          if dim_match:
              shortcut = data
          else:
              shortcut_conv = mx.sym.Convolution(
                  data=data,
                  num_filter=num_filter,
                  kernel=(1, 1),
                  stride=stride,
                  no_bias=True,
                  workspace=workspace,
                  name=name + "_sc",
              )
              shortcut = mx.sym.BatchNorm(
                  data=shortcut_conv,
                  fix_gamma=False,
                  eps=2e-5,
                  momentum=bn_mom,
                  name=name + "_sc_bn",
              )
  
          if memonger:
              shortcut._set_attr(mirror_stage="True")
          eltwise = bn2 + shortcut
          return mx.sym.Activation(
              data=eltwise, act_type="relu", name=name + "_relu"
          )
  
imports: import mxnet
  import numpy
label_desc: Use image node_id 1 for calling a global function with example usage: residual_unit(data, num_filter, stride, dim_match, name, bottle_neck, num_group, bn_mom, workspace, memonger) and returns: mx, mx