input: 
  def decode_libsvm(input, num_features, dtype=_dtypes.float32, label_dtype=_dtypes.int64, name=None):
      """Convert LibSVM input to tensors. The output consists of
  
      a label and a feature tensor. The shape of the label tensor
      is the same as input and the shape of the feature tensor is
      `[input_shape, num_features]`.
  
      Args:
          input: A `Tensor` of type `string`. Each string is a record in the LibSVM.
          num_features: An `int` that is `>= 1`. The number of features.
          dtype: An optional `tf.DType` from: `tf.float32, tf.float64, tf.int32, tf.int64`. Defaults to `tf.float32`.
          label_dtype: An optional `tf.DType` from: `tf.float32, tf.float64, tf.int32, tf.int64`. Defaults to `tf.int64`.
          name: A name for the operation (optional).
  
      Returns:
          A tuple of `Tensor` objects (label, feature_indices, feature_values, feature_shape).
  
          label: A `Tensor` of type `label_dtype`. A tensor of the same shape as input.
          feature_indices: A `Tensor` of type `int64`. A 2-D int64 tensor of dense_shape [N, ndims].
          feature_values: A `Tensor` of type `dtype`. A 1-D tensor of any type and dense_shape [N].
          feature_shape: A `Tensor` of type `int64`. A 1-D int64 tensor of dense_shape [ndims].
  
      Example:
      >>> decode_libsvm(tf.constant(["1 2:3 4:5"]), 5, dtype=tf.float32, label_dtype=tf.int32)
      (
          <tf.Tensor: shape=(1,), dtype=int32, numpy=array([1], dtype=int32)>,
          <tf.Tensor: shape=(2, 2), dtype=int64, numpy=array([[0, 2], [0, 4]])>,
          <tf.Tensor: shape=(2,), dtype=float32, numpy=array([3., 5.], dtype=float32)>,
          <tf.Tensor: shape=(2,), dtype=int64, numpy=array([1, 5])>
      )
      """
  
output:     
      with ops.name_scope(name, "decode_libsvm", [input]) as name:
          input = ops.convert_to_tensor(input, name="input")
          splits = array_ops.string_split(input, delimiter=" ").values
          labels = parsing_ops.decode_raw(splits[0], label_dtype)
          labels = array_ops.reshape(labels, array_ops.shape(input))
          
          feature_strings = splits[1:]
          feature_indices = array_ops.reshape(
              parsing_ops.decode_raw(
                  array_ops.string_to_number(
                      array_ops.substr(feature_strings, 0, array_ops.argmax(feature_strings, axis=0)),
                      out_type=_dtypes.int64
                  ),
                  _dtypes.int64
              ),
              [-1, 2]
          )
          feature_values = array_ops.reshape(
              parsing_ops.decode_raw(
                  array_ops.string_to_number(
                      array_ops.substr(feature_strings, array_ops.argmax(feature_strings, axis=0) + 1, -1),
                      out_type=dtype
                  ),
                  dtype
              ),
              [-1]
          )
          feature_shape = array_ops.stack([array_ops.shape(input)[0], num_features])
          
          return labels, feature_indices, feature_values, feature_shape
  