code: def check_forward(self, x_data, axis):
      eps = self.eps
      x = chainer.Variable(x_data)
  
      y = functions.normalize(x, eps=eps, axis=axis)
      self.assertEqual(y.data.dtype, self.dtype)
      y_data = cuda.to_cpu(y.data)
  
      y_expect = numpy.empty_like(self.x)
      shape = self.x.shape
      indices = []
      axis_tuple = axis if isinstance(axis, tuple) else (axis,)
      for i in six.moves.range(len(shape)):
          if i not in axis_tuple:
              indices.append(six.moves.range(shape[i]))
          else:
              indices.append([slice(None)])
      indices_tuple = list(itertools.product(*indices))
      for index in indices_tuple:
          # Note: Casting back the result of `numpy.linalg.norm` to `x.dtype`
          # because old NumPy casts it to float32 when a float16 value is
          # given.
          numerator = (
              numpy.linalg.norm(self.x[index]).astype(x.dtype) + eps
          )
          y_expect[index] = self.x[index] / numerator
      testing.assert_allclose(
          y_expect, y_data, **self.check_forward_options
      )
  
imports: import functools
  import itertools
  import unittest
  import numpy
  import six
  import chainer
  from chainer.backends import cuda
  from chainer import functions
  from chainer import gradient_check
  from chainer import testing
  from chainer.testing import attr
label_desc: Use image node_id 2 for calling the TestL2Normalization obj's underlying member method code with example usage: obj.check_forward(x_data, axis) without return types