def video_augmentation(features, hue=False, saturate=False, contrast=False):
  """Augments video with optional hue, saturation and constrast.

  Args:
    features: dict, with keys "inputs", "targets".
              features["inputs"], 4-D Tensor, shape=(THWC)
              features["targets"], 4-D Tensor, shape=(THWC)
    hue: bool, apply hue_transform.
    saturate: bool, apply saturation transform.
    contrast: bool, apply constrast transform.
  Returns:
    augment_features: dict with transformed "inputs" and "targets".
  """
  inputs, targets = features["inputs"], features["targets"]
  in_steps = common_layers.shape_list(inputs)[0]

  # makes sure that the same augmentation is applied to both input and targets.
  # if input is 4-D, then tf.image applies the same transform across the batch.
  video = tf.concat((inputs, targets), axis=0)
  if hue:
    video = tf.image.random_hue(video, max_delta=0.2)
  if saturate:
    video = tf.image.random_saturation(video, lower=0.5, upper=1.5)
  if contrast:
    video = tf.image.random_contrast(video, lower=0.5, upper=1.5)
  features["inputs"], features["targets"] = video[:in_steps], video[in_steps:]
  return features
Augments video with optional hue, saturation and constrast.

  Args:
    features: dict, with keys "inputs", "targets".
              features["inputs"], 4-D Tensor, shape=(THWC)
              features["targets"], 4-D Tensor, shape=(THWC)
    hue: bool, apply hue_transform.
    saturate: bool, apply saturation transform.
    contrast: bool, apply constrast transform.
  Returns:
    augment_features: dict with transformed "inputs" and "targets".
  
tensor2tensor/data_generators/video_utils.py