docs: def orthogonal(name, shape, scale=1.1, dtype=tf.sg_floatx, summary=True, regularizer=None, trainable=True):
      r"""Creates a tensor variable of which initial values are of
      an orthogonal ndarray.
      
      See [Saxe et al. 2014.](http://arxiv.org/pdf/1312.6120.pdf)
      
      Args:
        name: The name of new variable.
        shape: A tuple/list of integers. 
        scale: A Python scalar.
        dtype: Either float32 or float64.
        summary: If True, add this constant to tensor board summary.
        regularizer:  A (Tensor -> Tensor or None) function; the result of applying it on a newly created variable
          will be added to the collection tf.GraphKeys.REGULARIZATION_LOSSES and can be used for regularization
        trainable: If True, add this constant to trainable collection. Default is True.
  
      Returns:
        A `Variable`.
      """
      flat_shape = (shape[0], np.prod(shape[1:]))
      a = np.random.normal(0.0, 1.0, flat_shape)
      u, _, v = np.linalg.svd(a, full_matrices=False)
      # pick the one with the correct shape
      q = u if u.shape == flat_shape else v
      q = q.reshape(shape)
      # create variable
      x = tf.get_variable(name,
                          initializer=tf.constant(scale * q[:shape[0], :shape[1]], dtype=dtype),
                          regularizer=regularizer, trainable=trainable)
      # add summary
      if summary:
          tf.sg_summary_param(x)
      return x