code: def check_type_forward(self, in_types):
      n_in = in_types.size()
      type_check.expect(2 <= n_in, n_in <= 3)
      x_type, w_type = in_types[:2]
  
      type_check.expect(
          x_type.dtype.kind == "f",
          w_type.dtype.kind == "f",
          x_type.ndim == self.ndim + 2,
          w_type.ndim == self.ndim + 2,
          x_type.shape[1] == w_type.shape[0],
      )
  
      if self.outs is not None:
          for i, (out, s, p, di) in enumerate(
              zip(self.outs, self.stride, self.pad, self.dilate)
          ):
              lower_bound = conv.get_conv_outsize(
                  out, w_type.shape[i + 2], s, p, d=di
              )
              upper_bound = conv.get_conv_outsize(
                  out, w_type.shape[i + 2], s, p, cover_all=True, d=di
              )
              type_check.expect(
                  lower_bound <= x_type.shape[i + 2],
                  x_type.shape[i + 2] <= upper_bound,
              )
  
      if type_check.eval(n_in) == 3:
          b_type = in_types[2]
          type_check.expect(
              b_type.dtype.kind == "f",
              b_type.ndim == 1,
              # Need to consider the case that group count > 1.
              # b_type.shape[0] == w_type.shape[1]
          )
  
imports: import numpy
  from six import moves
  import chainer
  from chainer import backend
  from chainer.backends import cuda
  from chainer import configuration
  from chainer import function_node
  from chainer.functions.connection import convolution_2d
  from chainer.functions.connection import convolution_nd
  from chainer import utils
  from chainer.utils import conv
  from chainer.utils import conv_nd
  from chainer.utils import type_check
  import chainerx
label_desc: Use image node_id 2 for calling the DeconvolutionND obj's underlying member method code with example usage: obj.check_type_forward(in_types) without return types