code: def backward(self, indexes, grad_outputs):
      x, gamma = self.get_retained_inputs()
      (gy,) = grad_outputs
  
      interm_dtype = numpy.promote_types(x.dtype, gamma.dtype)
  
      gamma = chainer.functions.cast(gamma, interm_dtype)
  
      orig_shape = x.shape
      batch_size = orig_shape[0]
      groups = self.groups
      reduced_shape = (batch_size * groups, -1)
      x = x.reshape(reduced_shape)
      x_ = chainer.functions.cast(x, interm_dtype)
  
      (x_hat,) = _XHat(
          self.eps, self.mean, self.inv_std, self.dummy_gamma
      ).apply((x_,))
      gx_hat, ggamma, gbeta = _ScaleShiftGrad().apply(
          (x_hat, gamma, chainer.functions.cast(gy, interm_dtype))
      )
      (gx,) = _XHatGrad(
          self.eps,
          self.mean,
          self.inv_std,
          self.dummy_gamma,
          x_hat.array,
      ).apply((x_, gx_hat))
  
      gx = gx.reshape(orig_shape)
      return chainer.functions.cast(gx, x.dtype), ggamma, gbeta
  
imports: import numpy
  import chainer
  from chainer import backend
  from chainer.backends import cuda
  from chainer import configuration
  from chainer import function_node
  from chainer.utils import type_check
label_desc: Use image node_id 5 for calling the GroupNormalization obj's underlying member method code with example usage: obj.backward(indexes, grad_outputs) and returns: chainer,  ggamma,  gbeta