code: def forward_cpu(self, gys):
      func = self.func
      pad_value = func.pad_value
      ksize = func.ksize
      stride = func.stride
      pad = func.pad
      in_shape = func._in_shape
  
      (gy,) = gys
      idims = in_shape[2:]
      odims = gy.shape[2:]
      colon = slice(None, None, None)
      is_pad_value_none = pad_value is None
      if is_pad_value_none:
          numpy.divide(gy, func.width, out=gy)
      gy_index = (colon, colon) + (None,) * len(idims)
      gcol_reps = (1, 1) + ksize + (1,) * len(odims)
      gcol = numpy.tile(gy[gy_index], gcol_reps)
      gx = conv_nd.col2im_nd_cpu(gcol, stride, pad, idims)
      if not is_pad_value_none:
          gx /= functools.reduce(operator.mul, ksize)
      return (gx,)
  
imports: import functools
  import operator
  import numpy
  import six
  import chainer
  from chainer import backend
  from chainer.backends import cuda
  from chainer import function_node
  from chainer.functions.pooling import average_pooling_nd_kernel
  from chainer.functions.pooling import pooling_nd
  from chainer.utils import conv
  from chainer.utils import conv_nd
  import chainerx
label_desc: Use image node_id 2 for calling the AveragePoolingNDGrad obj's underlying member method code with example usage: obj.forward_cpu(gys) and returns: gx