class_docstr: When a function is called multiple times under each tower,
  it becomes hard to keep track of the scope and access those tensors
  in each tower.
  This class provides easy access to the tensors as well as the
  inputs/outputs created in each tower.
class_docstr_tok: ["When","a","function","is","called","multiple","times","under","each","tower",",","it","becomes","hard","to","keep","track","of","the","scope","and","access","those","tensors","in","each","tower",".","This","class","provides","easy","access","to","the","tensors","as","well","as","the","inputs\/outputs","created","in","each","tower","."]
code: def __init__(self, ctx, inputs, outputs, input_signature=None):
      self._ctx = ctx
  
      self._extra_tensor_names = {}
      if input_signature is not None:
          assert len(input_signature) == len(inputs)
          self._extra_tensor_names = {
              get_op_tensor_name(x.name)[1]: y
              for x, y in zip(input_signature, inputs)
          }
      self._inputs = inputs
      self._outputs = outputs
  
      # TODO: deprecated. Remove them later
      self.input = inputs
      self.output = outputs
  
imports: from abc import ABCMeta, abstractmethod, abstractproperty
  import six
  from ..compat import tfv1
  from ..utils import logger
  from ..utils.argtools import call_only_once
  from ..utils.develop import HIDE_DOC
  from ..utils.naming import MOVING_SUMMARY_OPS_KEY
  from .collection import CollectionGuard
  from .common import get_op_or_tensor_by_name, get_op_tensor_name
label_desc: Use image node_id 1 to create a new TowerTensorHandle object from inherited base classes: object with example: obj = TowerTensorHandle(ctx, inputs, outputs, input_signature)