Provides access to the model's Variables.
    This may include Variables that are not parameters, such as batch
    norm running moments.
    :return: A list of all Variables defining the model.

def get_vars(self):
    """
    Provides access to the model's Variables.
    This may include Variables that are not parameters, such as batch
    norm running moments.
    :return: A list of all Variables defining the model.
    """

    # Catch eager execution and assert function overload.
    try:
      if tf.executing_eagerly():
        raise NotImplementedError("For Eager execution - get_vars "
                                  "must be overridden.")
    except AttributeError:
      pass

    done = False
    tried_to_make_params = False
    while not done:
      # Most models in cleverhans use only trainable variables and do not
      # make sure the other collections are updated correctly.
      trainable_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,
                                         self.scope + "/")
      # When wrapping other code, such as the CIFAR 10 challenge models,
      # we need to make sure we get the batch norm running averages as well
      # as the trainable variables.
      model_vars = tf.get_collection(tf.GraphKeys.MODEL_VARIABLES,
                                     self.scope + "/")
      scope_vars = ordered_union(trainable_vars, model_vars)

      if len(scope_vars) > 0:
        done = True
      else:
        assert not tried_to_make_params
        tried_to_make_params = True
        self.make_params()

    # Make sure no variables have been added or removed
    if hasattr(self, "num_vars"):
      assert self.num_vars == len(scope_vars)
    else:
      self.num_vars = len(scope_vars)

    return scope_vars