code: def _layer_normalization(X, W, B, axis=-1, epsilon=1e-5):  # type: ignore
      X_shape = X.shape
      X_rank = len(X_shape)
      if axis < 0:
          # If axis = -1 and rank of X is 4,
          # the axis is changed to -1 + 4 = 3,
          # which means the last axis.
          axis = axis + X_rank
      unsqueezed_rank = X_rank - axis
      reduction_shape = X_shape[0:axis] + (1,) * unsqueezed_rank
  
      # Parameter used to convert N-D tensor layer
      # normalization to equivalent 2-D matirx operations.
      row_number = 1
      col_number = 1
      for i in range(X_rank):
          if i < axis:
              row_number *= X_shape[i]
          else:
              col_number *= X_shape[i]
  
      # After reshaping input tensor X into a matrix,
      # layer normalization is equivalent to conducting
      # standardization on each column vector (s.t. each
      # column has zero mean and unit variance).
      x_mat = np.reshape(X, (row_number, col_number))
      # This computes mean for every x_mat's column.
      x_mean = np.sum(x_mat, axis=1, keepdims=True) / col_number
      x_diff = x_mat - x_mean
      x_squared_diff = x_diff * x_diff
      # This computes variance for every x_mat's column.
      variance = (
          np.sum(x_squared_diff, axis=1, keepdims=True) / col_number
      )
      variance_eps = variance + epsilon
      std_dev = np.sqrt(variance_eps)
      inv_std_dev = np.reciprocal(std_dev)
      # Standardization step. y_mat is zero-mean and unit-variance.
      y_mat = x_diff * inv_std_dev
      # Apply affine transform on normalization outcome.
      # W is linear coefficient while B is bias.
      Y = np.reshape(y_mat, X_shape) * W + B
      # Matrix-level operations' outputs should be reshaped
      # to compensate the initial tensor-to-matrix reshape.
      X_mean = np.reshape(x_mean, reduction_shape)
      X_inv_std_dev = np.reshape(inv_std_dev, reduction_shape)
  
      return Y, X_mean, X_inv_std_dev
  
file_path: onnx/onnx/backend/test/case/node/layernormalization.py
imports: import numpy
  import onnx
  from onnx.backend.test.case.base import Base
  from onnx.backend.test.case.node import expect
label_desc: Use image node_id 1 for calling a global function with example usage: _layer_normalization(X, W, B, axis, epsilon) and returns: Y,  X_mean,  X_inv_std_dev