docs: def modify_model_backprop(model, backprop_modifier):
      """Creates a copy of model by modifying all activations to use a custom op to modify the backprop behavior.
  
      Args:
          model:  The `keras.models.Model` instance.
          backprop_modifier: One of `{'guided', 'rectified'}`
  
      Returns:
          A copy of model with modified activations for backwards pass.
      """
      # The general strategy is as follows:
      # - Save original model so that upstream callers don't see unexpected results with their models.
      # - Call backend specific function that registers the custom op and loads the model under modified context manager.
      # - Maintain cache to save this expensive process on subsequent calls.
      # - Load model with custom context modifying backprop behavior.
      #
      # The reason for this round about way is because the graph needs to be rebuild when any of its layer builder
      # functions are changed. This is very complicated to do in Keras and makes the implementation very tightly bound
      # with keras internals. By saving and loading models, we dont have to worry about future compatibility.
      #
      # The only exception to this is the way advanced activations are handled which makes use of some keras internal
      # knowledge and might break in the future.
      # ADD on 22 Jul 2018:
      #     In fact, it has broken. Currently, advanced activations are not supported.
  
      # 0. Retrieve from cache if previously computed.
      modified_model = _MODIFIED_MODEL_CACHE.get((model, backprop_modifier))
      if modified_model is not None:
          return modified_model
  
      model_path = os.path.join(tempfile.gettempdir(), next(tempfile._get_candidate_names()) + '.h5')
      try:
          # 1. Save original model
          model.save(model_path)
  
          # 2. Register modifier and load modified model under custom context.
          modifier_fn = _BACKPROP_MODIFIERS.get(backprop_modifier)
          if modifier_fn is None:
              raise ValueError("'{}' modifier is not supported".format(backprop_modifier))
          modifier_fn(backprop_modifier)
  
          # 3. Create graph under custom context manager.
          with tf.get_default_graph().gradient_override_map({'Relu': backprop_modifier}):
              #  This should rebuild graph with modifications.
              modified_model = load_model(model_path)
  
              # Cache to improve subsequent call performance.
              _MODIFIED_MODEL_CACHE[(model, backprop_modifier)] = modified_model
              return modified_model
      finally:
          os.remove(model_path)