class_docstr: Initializer that generates an orthogonal matrix.
  
  NOTE: Does not support 1D tensors.
  
  The implementation is based on :cite:`saxe2013exact`.
  
  If the shape of the tensor to initialize is two-dimensional, it is initialized
  with an orthogonal matrix obtained from the QR decomposition of a matrix of
  random numbers drawn from a normal distribution.
  If the matrix has fewer rows than columns then the output will have orthogonal
  rows. Otherwise, the output will have orthogonal columns.
  
  If the shape of the tensor to initialize is more than two-dimensional,
  a matrix of shape ``(shape[0] * ... * shape[n - 2], shape[n - 1])``
  is initialized, where ``n`` is the length of the shape vector.
  The matrix is subsequently reshaped to give a tensor of the desired shape.
class_docstr_tok: ["Initializer","that","generates","an","orthogonal","matrix",".","NOTE",":","Does","not","support","1D","tensors",".","The","implementation","is","based","on",":","cite",":","`","saxe2013exact","`",".","If","the","shape","of","the","tensor","to","initialize","is","two-dimensional",",","it","is","initialized","with","an","orthogonal","matrix","obtained","from","the","QR","decomposition","of","a","matrix","of","random","numbers","drawn","from","a","normal","distribution",".","If","the","matrix","has","fewer","rows","than","columns","then","the","output","will","have","orthogonal","rows",".","Otherwise",",","the","output","will","have","orthogonal","columns",".","If","the","shape","of","the","tensor","to","initialize","is","more","than","two-dimensional",",","a","matrix","of","shape","``","(","shape","[","0","]","*","...","*","shape","[","n","-","2","]",",","shape","[","n","-","1","]",")","``","is","initialized",",","where","``","n","``","is","the","length","of","the","shape","vector",".","The","matrix","is","subsequently","reshaped","to","give","a","tensor","of","the","desired","shape","."]
code: def __call__(
      self, shape: types.ShapeLike, dtype: tf.DType
  ) -> tf.Tensor:
      dtype = _as_floating_dtype(dtype)
      if len(shape) < 2:
          raise ValueError(
              "The tensor to initialize must be "
              "at least two-dimensional"
          )
      # Flatten the input shape with the last dimension remaining
      # its original shape so it works for conv2d
      num_rows = 1
      for dim in shape[:-1]:
          num_rows *= dim
      num_cols = shape[-1]
      flat_shape = [
          tf.maximum(num_cols, num_rows),
          tf.minimum(num_cols, num_rows),
      ]
  
      # Generate a random matrix
      a = tf.random.normal(flat_shape, dtype=dtype, seed=self.seed)
      # Compute the qr factorization
      q, r = tf.linalg.qr(a, full_matrices=False)
      # Make Q uniform
      d = tf.linalg.tensor_diag_part(r)
      q *= tf.sign(d)
      if num_rows < num_cols:
          q = tf.linalg.matrix_transpose(q)
      return self.gain * tf.reshape(q, shape)
  
imports: import abc
  import collections
  from typing import Iterable, Mapping, Optional, Union
  import numpy
  from sonnet.src import types
  import tensorflow
label_desc: Use image node_id 2 for calling the Orthogonal obj's underlying member method code with example usage: obj.__call__(shape, dtype) and returns: unknown