code: def make_node(self, x, dy, scale, x_mean, x_invstd, epsilon=1e-4):
      x = as_tensor_variable(x)
      dy = as_tensor_variable(dy)
      scale = as_tensor_variable(scale)
      x_mean = as_tensor_variable(x_mean)
      x_invstd = as_tensor_variable(x_invstd)
      epsilon = as_tensor_variable(epsilon)
  
      # Upcast to common dtype on the non-scalar
      # Keep as is dtype of scalar (epsilon)
      x, dy, scale, x_mean, x_invstd = as_common_dtype(
          x, dy, scale, x_mean, x_invstd
      )
      assert (
          x.ndim
          == dy.ndim
          == scale.ndim
          == x_mean.ndim
          == x_invstd.ndim
      )
      return Apply(
          self,
          [x, dy, scale, x_mean, x_invstd, epsilon],
          [x.type(), scale.type(), scale.type()],
      )
  
imports: from __future__ import absolute_import, print_function, division
  import numpy
  import theano
  from theano import Apply, Op
  from theano.gof import local_optimizer
  from theano.gof.opt import copy_stack_trace
  from theano.tensor import as_tensor_variable, TensorType
  from theano.tensor import basic
  from theano.tensor.opt import register_specialize_device
  from theano.scalar import Composite, as_common_dtype
  from theano.scalar import add, sub, true_div, mul
label_desc: Use image node_id 2 for calling the AbstractBatchNormTrainGrad obj's underlying member method code with example usage: obj.make_node(x, dy, scale, x_mean, x_invstd, epsilon) and returns: Apply