code: def backward(self, indexes, grad_outputs):
      a, b = self.get_retained_inputs()
      (gc,) = grad_outputs
  
      ga = None
      if 0 in indexes:
          (ga,) = TensorDot(
              a_axes=self.c_axes,
              b_axes=[self.b_axes[1], self.b_axes[0]],
              c_axes=self.a_axes,
              dtype=a.dtype,
          ).apply((gc, b))
  
      gb = None
      if 1 in indexes:
          (gb,) = TensorDot(
              a_axes=[self.a_axes[1], self.a_axes[0]],
              b_axes=self.c_axes,
              c_axes=self.b_axes,
              dtype=b.dtype,
          ).apply((a, gc))
  
      return ga, gb
  
file_path: chainer/chainer/functions/math/tensordot.py
imports: import numpy
  import six
  from chainer import backend
  from chainer import function_node
  from chainer import utils
  from chainer.utils import collections_abc
  from chainer.utils import type_check
label_desc: Use image node_id 4 for calling the TensorDot obj's underlying member method code with example usage: obj.backward(indexes, grad_outputs) and returns: ga,  gb