code: def testGradGrad(self):
      def f(x):
          with backprop.GradientTape() as tape:
              tape.watch(x)
              y = math_ops.square(x)
              z = math_ops.square(y)
          return tape.gradient(z, x)
  
      analytical, numerical = gradient_checker.compute_gradient(
          f, [2.0]
      )
      self.assertAllEqual([[[48.0]]], analytical)
      self.assertAllClose([[[48.0]]], numerical, rtol=1e-4)
  
imports: import numpy
  from tensorflow.python.eager import backprop
  from tensorflow.python.framework import constant_op
  from tensorflow.python.framework import dtypes
  from tensorflow.python.framework import sparse_tensor
  from tensorflow.python.framework import test_util
  from tensorflow.python.ops import array_ops
  from tensorflow.python.ops import custom_gradient
  from tensorflow.python.ops import gradient_checker_v2
  from tensorflow.python.ops import math_ops
  from tensorflow.python.ops import nn_ops
  from tensorflow.python.ops import sparse_ops
  import tensorflow.python.ops.nn_grad
  from tensorflow.python.platform import test
  from tensorflow.python.platform import tf_logging
label_desc: Use image node_id 15 for calling the GradientCheckerTest obj's underlying member method code with example usage: obj.testGradGrad() and returns: tape