def METHOD_NAME(file_path, image_path, shuffle, batch_size, num_epochs):
    """Generates a data input function.
    Args:
        file_path: String with path to the data.
        image_path: String with path to image folder.
        shuffle: Boolean flag specifying if data should be shuffled.
        batch_size: Number of records to be read at a time.
        num_epochs: Number of times to go through all of the records.
    Returns:
        A function used by `Estimator` to read data.
    """
    def _input_fn():
        """Returns features and target from input data.
        Defines the input dataset, specifies how to read the data, and reads it.
        Returns:
            A tuple os a dictionary containing the features and the target.
        """
        num_threads = multiprocessing.cpu_count()
        dataset = tf.data.TextLineDataset(filenames=[file_path])
        dataset = dataset.skip(1)
        dataset = dataset.map(
            lambda x: _parse_csv(tf.expand_dims(x, -1)),
            num_parallel_calls=num_threads)
        dataset = dataset.map(
            lambda x: _process_features(x, image_path),
            num_parallel_calls=num_threads)
        dataset = dataset.map(
            _get_features_target_tuple,
            num_parallel_calls=num_threads)
        if shuffle:
            dataset = dataset.shuffle(SHUFFLE_BUFFER_SIZE)
        dataset = dataset.batch(batch_size)
        dataset = dataset.repeat(num_epochs)
        dataset = dataset.prefetch(1)
        iterator = dataset.make_one_shot_iterator()
        features, target = iterator.get_next()
        return features, target
    return _input_fn