class_docstr: Base class for all gradient processors.
  Gradient processors can be applied to optimizers by
  :func:`optimizer.apply_grad_processors`.
  
  Subclass should override the ``_process()`` method.
class_docstr_tok: ["Base","class","for","all","gradient","processors",".","Gradient","processors","can","be","applied","to","optimizers","by",":","func",":","`","optimizer.apply_grad_processors","`",".","Subclass","should","override","the","``","_process","(",")","``","method","."]
docstr: Process the symbolic gradients.
  
  Args:
      grads (list): list of (grad, var).
  Returns:
      list: processed gradients, with the same type as input.
docstr_tok: ["Process","the","symbolic","gradients",".","Args",":","grads","(","list",")",":","list","of","(","grad",",","var",")",".","Returns",":","list",":","processed","gradients",",","with","the","same","type","as","input","."]
code: def process(self, grads):
      """
      Process the symbolic gradients.
  
      Args:
          grads (list): list of (grad, var).
      Returns:
          list: processed gradients, with the same type as input.
      """
  
      # reuse the old name_scope, if process() is called multiple times
      if self._name_scope is None:
          with tfv1.name_scope(type(self).__name__) as scope:
              self._name_scope = scope
              return self._process(grads)
      else:
          with tfv1.name_scope(self._name_scope):
              return self._process(grads)
  
imports: import inspect
  import re
  from abc import ABCMeta, abstractmethod
  import six
  import tensorflow
  from ..compat import tfv1
  from ..utils import logger
  from .summary import add_moving_summary
  from .symbolic_functions import print_stat, rms
label_desc: Use image node_id 1 for calling the GradientProcessor obj's underlying member method code with example usage: obj.process(grads) and returns: self, self