class_docstr: A specialized KerasTensor representation for `tf.RaggedTensor`s.
  
  Specifically, it:
  
  1. Specializes the conversion to a placeholder in order
  to maintain shape information for non-ragged dimensions.
  2. Overloads the KerasTensor's operators with the RaggedTensor versions
  when they don't match the `tf.Tensor` versions
  3. Exposes some of the instance method/attribute that are unique to
  the RaggedTensor API (such as ragged_rank).
class_docstr_tok: ["A","specialized","KerasTensor","representation","for","`","tf.RaggedTensor","`","s",".","Specifically",",","it",":","1",".","Specializes","the","conversion","to","a","placeholder","in","order","to","maintain","shape","information","for","non-ragged","dimensions",".","2",".","Overloads","the","KerasTensor","'s","operators","with","the","RaggedTensor","versions","when","they","do","n't","match","the","`","tf.Tensor","`","versions","3",".","Exposes","some","of","the","instance","method\/attribute","that","are","unique","to","the","RaggedTensor","API","(","such","as","ragged_rank",")","."]
code: def _to_placeholder(self):
      ragged_spec = self.type_spec
      if ragged_spec.ragged_rank == 0 or ragged_spec.shape.rank is None:
          return super(RaggedKerasTensor, self)._to_placeholder()
  
      flat_shape = ragged_spec.shape[ragged_spec.ragged_rank :]
      result = array_ops.placeholder(ragged_spec.dtype, flat_shape)
  
      known_num_splits = []
      prod = 1
      for axis_size in ragged_spec.shape:
          if prod is not None:
              if axis_size is None or (
                  getattr(axis_size, "value", True) is None
              ):
                  prod = None
              else:
                  prod = prod * axis_size
          known_num_splits.append(prod)
  
      for axis in range(ragged_spec.ragged_rank, 0, -1):
          axis_size = ragged_spec.shape[axis]
          if axis_size is None or (
              getattr(axis_size, "value", True) is None
          ):
              num_splits = known_num_splits[axis - 1]
              if num_splits is not None:
                  num_splits = num_splits + 1
              splits = array_ops.placeholder(
                  ragged_spec.row_splits_dtype, [num_splits]
              )
              result = ragged_tensor.RaggedTensor.from_row_splits(
                  result, splits, validate=False
              )
          else:
              rowlen = constant_op.constant(
                  axis_size, ragged_spec.row_splits_dtype
              )
              result = (
                  ragged_tensor.RaggedTensor.from_uniform_row_length(
                      result, rowlen, validate=False
                  )
              )
      return result
  
imports: from tensorflow.python.framework import constant_op
  from tensorflow.python.framework import dtypes
  from tensorflow.python.framework import sparse_tensor
  from tensorflow.python.framework import tensor
  from tensorflow.python.framework import tensor_shape
  from tensorflow.python.framework import type_spec
  from tensorflow.python.keras.utils import object_identity
  from tensorflow.python.ops import array_ops
  from tensorflow.python.ops.ragged import ragged_operators
  from tensorflow.python.ops.ragged import ragged_tensor
  from tensorflow.python.util import nest
label_desc: Use image node_id 1 for calling the RaggedKerasTensor obj's underlying member method code with example usage: obj._to_placeholder() and returns: result, super