class_docstr: Unpooling over a set of 2d planes.
code: def forward(self, x):
      h, w = x[0].shape[2:]
      if self.outh is None:
          self.outh = conv.get_deconv_outsize(
              h, self.kh, self.sy, self.ph, cover_all=self.cover_all
          )
      if self.outw is None:
          self.outw = conv.get_deconv_outsize(
              w, self.kw, self.sx, self.pw, cover_all=self.cover_all
          )
      if (
          self.outh % (h - self.ph) == 0
          and self.outw % (w - self.pw) == 0
          and self.outh // (h - self.ph) == self.kh
          and self.outw // (w - self.pw) == self.kw
          and self.ph % 2 == 0
          and self.pw % 2 == 0
          and self.sx == self.kh
          and self.sy == self.kw
      ):
          self._use_int_scale_forward = True
          return self._integer_scale_forward(x[0])
      xp = backend.get_array_module(*x)
      col = xp.tile(
          x[0][:, :, None, None], (1, 1, self.kh, self.kw, 1, 1)
      )
      if xp is numpy:
          y = conv.col2im_cpu(
              col,
              self.sy,
              self.sx,
              self.ph,
              self.pw,
              self.outh,
              self.outw,
          )
      else:
          y = conv.col2im_gpu(
              col,
              self.sy,
              self.sx,
              self.ph,
              self.pw,
              self.outh,
              self.outw,
          )
      return (y,)
  
imports: import numpy
  import numpy.lib.stride_tricks
  from chainer import backend
  from chainer.backends import cuda
  from chainer import function_node
  from chainer.functions.pooling import pooling_2d
  from chainer.utils import conv
  from chainer.utils import type_check
label_desc: Use image node_id 4 for calling the Unpooling2D obj's underlying member method code with example usage: obj.forward(x) and returns: y, self