class_docstr: A factory for an expression for the following tuple per (optionally
  adversarial) example:
    - integer class assigned to the example by the model
    - probability assigned to that prediction
code: def __init__(self, model, attack=None, attack_params=None):
      if attack_params is None:
          attack_params = {}
      self.model = model
      self.attack = attack
      self.attack_params = attack_params
      hashable_attack_params = tuple(
          (key, attack_params[key])
          for key in sorted(attack_params.keys())
      )
      self.properties_to_hash = (model, attack, hashable_attack_params)
  
imports: from distutils.version import LooseVersion
  import warnings
  import numpy
  from six.moves import range
  import tensorflow
  import cleverhans
  from cleverhans import canary
  from cleverhans.utils import create_logger
  from cleverhans.utils_tf import infer_devices
label_desc: Use image node_id 1 to create a new _ClassAndProbFactory object from inherited base classes: object with example: obj = _ClassAndProbFactory(model, attack, attack_params)