code: def backward(self, indexes, grad_outputs):
      x_hat, gamma, gy = self.get_retained_inputs()
      ggx_hat, gggamma, ggbeta = grad_outputs
  
      orig_shape = gy.shape
      batch_size, channels = gy.shape[:2]
      gy = gy.reshape((batch_size, channels, -1))
  
      reduced_shape = x_hat.shape
      x_hat = x_hat.reshape((batch_size, channels, -1))
      ggx_hat = ggx_hat.reshape((batch_size, channels, -1))
  
      gx_hat2 = gggamma[:, None] * gy
      ggamma2 = chainer.functions.sum(ggx_hat * gy, axis=(0, 2))
      ggy = (
          ggx_hat * gamma[:, None]
          + gggamma[:, None] * x_hat
          + ggbeta[:, None]
      )
  
      gx_hat2 = gx_hat2.reshape(reduced_shape)
      ggy = ggy.reshape(orig_shape)
      return gx_hat2, ggamma2, ggy
  
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 2 for calling the _ScaleShiftGrad obj's underlying member method code with example usage: obj.backward(indexes, grad_outputs) and returns: gx_hat2,  ggamma2,  ggy