code: def _shadow_model_variables(shadow_vars):
          
          G = tf.get_default_graph()
          curr_shadow_vars = set([v.name for v in shadow_vars])
          model_vars = tf.model_variables()
          shadow_model_vars = []
          for v in model_vars:
              assert v.name.startswith('tower'), "Found some MODEL_VARIABLES created outside of the tower function!"
              stripped_op_name, stripped_var_name = get_op_tensor_name(re.sub('^tower[0-9]+/', '', v.name))
              if stripped_op_name in curr_shadow_vars:
                  continue
              try:
                  G.get_tensor_by_name(stripped_var_name)
                  logger.warn("Model Variable {} also appears in other collections.".format(stripped_var_name))
                  continue
              except KeyError:
                  pass
              new_v = tf.get_variable(stripped_op_name, dtype=v.dtype.base_dtype,
                                      initializer=v.initial_value,
                                      trainable=False)
  
              curr_shadow_vars.add(stripped_op_name)  # avoid duplicated shadow_model_vars
              shadow_vars.append(new_v)
              shadow_model_vars.append((new_v, v))  # only need to sync model_var from one tower
          return shadow_model_vars
docs: Create shadow vars for model_variables as well, and add to the list of ``shadow_vars``.
  
          Returns:
              list of (shadow_model_var, local_model_var) used for syncing.