code: def forward(self, inputs):
      # Channels-first is Chainer's tensor format
      # W is 6-dimensional
      x, W = inputs[:2]
      b = inputs[2] if len(inputs) == 3 else None
      stride_row, stride_col = self.sy, self.sx
      output_row, output_col = W.shape[1], W.shape[2]
      feature_dim = W.shape[3] * W.shape[4] * W.shape[5]
      xp = backend.get_array_module(*inputs)
      output = xp.empty(
          (
              x.shape[0],
              W.shape[0],
              output_row,
              output_col,
          ),
          dtype=x.dtype,
      )
      for i in moves.range(output_row):
          for j in moves.range(output_col):
              slice_row = slice(
                  i * stride_row, i * stride_row + W.shape[4]
              )
              slice_col = slice(
                  j * stride_col, j * stride_col + W.shape[5]
              )
              x_flatten = xp.reshape(
                  x[..., slice_row, slice_col], (-1, feature_dim)
              )
              W_flatten = xp.reshape(W[:, i, j, ...], (-1, feature_dim))
              output[..., i, j] = xp.dot(x_flatten, W_flatten.T)
  
      if b is not None:
          output += b[None, :, :, :]
  
      self.retain_inputs((0, 1))  # only retain x and W
      return (output,)
  
file_path: chainer/chainer/functions/connection/local_convolution_2d.py
imports: from six import moves
  import chainer
  from chainer import backend
  from chainer import function_node
  from chainer.utils import type_check
  from chainer import variable
label_desc: Use image node_id 3 for calling the LocalConvolution2DFunction obj's underlying member method code with example usage: obj.forward(inputs) and returns: output