code: def build_csv_serving_tensors_for_transform_step(analysis_path,
                                                   features,
                                                   schema,
                                                   stats,
                                                   keep_target):
    
  
    csv_header, record_defaults = csv_header_and_defaults(features, schema, stats, keep_target)
  
    placeholder = tf.placeholder(dtype=tf.string, shape=(None,),
                                 name='csv_input_placeholder')
    tensors = tf.decode_csv(placeholder, record_defaults)
    raw_features = dict(zip(csv_header, tensors))
  
    transform_fn = make_preprocessing_fn(analysis_path, features, keep_target)
    transformed_tensors = transform_fn(raw_features)
  
    transformed_features = {}
    # Expand the dims of non-sparse tensors
    for k, v in six.iteritems(transformed_tensors):
      if isinstance(v, tf.Tensor) and v.get_shape().ndims == 1:
        transformed_features[k] = tf.expand_dims(v, -1)
      else:
        transformed_features[k] = v
  
    return input_fn_utils.InputFnOps(
        transformed_features, None, {"csv_example": placeholder})
docs: Builds a serving function starting from raw csv.
  
    This should only be used by transform.py (the transform step), and the
  
    For image columns, the image should be a base64 string encoding the image.
    The output of this function will transform that image to a 2048 long vector
    using the inception model.