code: def apply_modifications(model, custom_objects=None):
      
      # The strategy is to save the modified model and load it back. This is done because setting the activation
      # in a Keras layer doesnt actually change the graph. We have to iterate the entire graph and change the
      # layer inbound and outbound nodes with modified tensors. This is doubly complicated in Keras 2.x since
      # multiple inbound and outbound nodes are allowed with the Graph API.
      model_path = os.path.join(tempfile.gettempdir(), next(tempfile._get_candidate_names()) + '.h5')
      try:
          model.save(model_path)
          return load_model(model_path, custom_objects=custom_objects)
      finally:
          os.remove(model_path)
docs: Applies modifications to the model layers to create a new Graph. For example, simply changing
      `model.layers[idx].activation = new activation` does not change the graph. The entire graph needs to be updated
      with modified inbound and outbound tensors because of change in layer building function.
  
      Args:
          model: The `keras.models.Model` instance.
  
      Returns:
          The modified model with changes applied. Does not mutate the original `model`.