docs: def sg_ctc(tensor, opt):
      r"""Computes the CTC (Connectionist Temporal Classification) Loss between `tensor` and `target`.
  
      Args:
        tensor: A 3-D `float Tensor`.
        opt:
          target: A `Tensor` with the same length in the first dimension as the `tensor`. Labels. ( Dense tensor )
          name: A `string`. A name to display in the tensor board web UI.
  
      Returns:
        A 1-D `Tensor` with the same length in the first dimension of the `tensor`.
  
      For example,
  
      ```
      tensor = [[[2., -1., 3.], [3., 1., -2.]], [[1., -1., 2.], [3., 1., -2.]]]
      target = [[2., 1.], [2., 3.]]
      tensor.sg_ctc(target=target) => [ 4.45940781  2.43091154]
      ```
      """
      assert opt.target is not None, 'target is mandatory.'
  
      # default sequence length
      shape = tf.shape(tensor)
      opt += tf.sg_opt(seq_len=tf.ones((shape[0],), dtype=tf.sg_intx) * shape[1], merge=True)
  
      # ctc loss
      out = tf.nn.ctc_loss(opt.target.sg_to_sparse(), tensor, opt.seq_len,
                           ctc_merge_repeated=opt.merge, time_major=False)
      out = tf.identity(out, 'ctc')
  
      # add summary
      tf.sg_summary_loss(out, name=opt.name)
  
      return out