class_docstr: GroupNorm normalization layer (Wu and He, 2014).
  
  Parameters
  ----------
  ngroups : int
      Numnber of channel groups in GN.
  in_channels : int, default 0
      Number of channels (feature maps) in input data. If not specified,
      initialization will be deferred to the first time `forward` is called
      and `in_channels` will be inferred from the shape of input data.
  axis : int, default 1
      The axis that should be normalized. This is typically the channels
      (C) axis. For instance, after a `Conv2D` layer with `layout='NCHW'`,
      set `axis=1` in `GroupNorm`. If `layout='NHWC'`, then set `axis=3`.
  epsilon: float, default 1e-5
      Small float added to variance to avoid dividing by zero.
  beta_initializer: str or `Initializer`, default 'zeros'
      Initializer for the beta weight.
  gamma_initializer: str or `Initializer`, default 'ones'
      Initializer for the gamma weight.
  scale: bool, default True
      If True, multiply by `gamma`. If False, `gamma` is not used.
  
  Inputs:
      - **data**: input tensor with arbitrary shape.
  
  Outputs:
      - **out**: output tensor with the same shape as `data`.
code: def hybrid_forward(self, F, x, gamma, beta):
      # normalization
      with autograd.train_mode():
          y = x.expand_dims(0).reshape(0, 0, self.ngroups, -1)
          y = y.reshape(1, -3, -1)
          batch = x.shape[0]
          y = F.BatchNorm(
              y,
              F.ones(batch * self.ngroups, ctx=x.context),
              F.zeros(batch * self.ngroups, ctx=x.context),
              F.zeros(batch * self.ngroups, ctx=x.context),
              F.ones(batch * self.ngroups, ctx=x.context),
              name="fwd",
              **self._kwargs,
          )
      # scale and shift
      y = y.reshape_like(x).reshape(0, 0, -1)
      if self.scale:
          y = y * gamma.reshape(1, -1, 1) + beta.reshape(1, -1, 1)
      else:
          y = y + beta.reshape(1, -1, 1)
      return y.reshape_like(x)
  
file_path: gluon-cv/gluoncv/nn/gn.py
imports: import numpy
  from mxnet.gluon.block import HybridBlock
  from mxnet import autograd
label_desc: Use image node_id 3 for calling the GroupNorm obj's underlying member method code with example usage: obj.hybrid_forward(F, x, gamma, beta) and returns: y