code: def preprocess_image(image_buffer, output_height, output_width,
                       num_channels, is_training=False):
    
    if is_training:
      # For training, we want to randomize some of the distortions.
      image = _decode_crop_and_flip(image_buffer, num_channels)
  
      mlperf_log.resnet_print(key=mlperf_log.INPUT_RESIZE,
                              value=[output_height, output_width])
      image = _resize_image(image, output_height, output_width)
    else:
      # For validation, we want to decode, resize, then just crop the middle.
      image = tf.image.decode_jpeg(image_buffer, channels=num_channels)
      image = _aspect_preserving_resize(image, _RESIZE_MIN)
  
      mlperf_log.resnet_print(key=mlperf_log.INPUT_RESIZE,
                              value=[output_height, output_width])
      image = _central_crop(image, output_height, output_width)
  
    image.set_shape([output_height, output_width, num_channels])
  
    return _mean_image_subtraction(image, _CHANNEL_MEANS, num_channels)
docs: Preprocesses the given image.
  
    Preprocessing includes decoding, cropping, and resizing for both training
    and eval images. Training preprocessing, however, introduces some random
    distortion of the image to improve accuracy.
  
    Args:
      image_buffer: scalar string Tensor representing the raw JPEG image buffer.
      output_height: The height of the image after preprocessing.
      output_width: The width of the image after preprocessing.
      num_channels: Integer depth of the image buffer for decoding.
      is_training: `True` if we're preprocessing the image for training and
        `False` otherwise.
  
    Returns:
      A preprocessed image.