          loss: list
              The loss for each side. List should contain 2 ``floats`` side "a" in position 0 and
              side "b" in position `.
           """
          output = ", ".join(["Loss {}: {:.5f}".format(side, side_loss)
                              for side, side_loss in zip(("A", "B"), loss)])
          timestamp = time.strftime("%H:%M:%S")
          output = "[{}] [#{:05d}] {}".format(timestamp, self._model.iterations, output)
          print("\r{}".format(output), end="")
  
 
</s> remove         output = "[{}] [#{:05d}] {}".format(timestamp, self._model.iterations, output)
        print("\r{}".format(output), end="")
 </s> add         output = f"[{timestamp}] [#{self._model.iterations:05d}] {output}"
        print(f"\r{output}", end="") </s> remove             predictions = [preds["{0}_{0}".format(side)],
                           preds["{}_{}".format(other_side, side)]]
 </s> add             predictions = [preds[f"{side}_{side}"],
                           preds[f"{other_side}_{side}"]] </s> remove         samples = dict()
        images = dict()
        masks = dict()
 </s> add         samples = {}
        images = {}
        masks = {} </s> remove                 if not split_output:  # Rename losses to reflect the side's output
                    loss_name = f"{loss_name.replace('_both', '')}_{side}"
 </s> add                 if loss_name[-2:] not in ("_a", "_b"):  # Rename losses to reflect the side output
                    new_name = f"{loss_name.replace('_both', '')}_{side}"
                    logger.debug("Renaming loss output from '%s' to '%s'", loss_name, new_name)
                    loss_name = new_name </s> remove         # loss length of unique should be 3:
        # - decoder_both, 1, 2
        # - docoder_a, decoder_b, 1
        split_output = len(np.unique(model_outputs[..., :2])) != 3
 </s> add 
        output = ", ".join([f"Loss {side}: {side_loss:.5f}"
          loss: list
              The loss for each side. List should contain 2 ``floats`` side "a" in position 0 and
              side "b" in position `.
           """
        output = ", ".join([f"Loss {side}: {side_loss:.5f}"
                              for side, side_loss in zip(("A", "B"), loss)])
          timestamp = time.strftime("%H:%M:%S")
          output = "[{}] [#{:05d}] {}".format(timestamp, self._model.iterations, output)
          print("\r{}".format(output), end="")
  
keep keep keep keep replace keep keep keep keep keep
 Update code to support Tensorflow versions up to 2.8 (#1213)

* Update maximum tf version in setup + requirements

* - bump max version of tf version in launcher
- standardise tf version check

* update keras get_custom_objects  for tf>2.6

* bugfix: force black text in GUI file dialogs (linux)

* dssim loss - Move to stock tf.ssim function

* Update optimizer imports for compatibility

* fix logging for tf2.8

* Fix GUI graphing for TF2.8

* update tests

* bump requirements.txt versions

* Remove limit on nvidia-ml-py

* Graphing bugfixes
  - Prevent live graph from displaying if data not yet available

* bugfix: Live graph. Collect loss labels correctly

* fix: live graph - swallow inconsistent loss errors

* Bugfix: Prevent live graph from clearing during training

* Fix graphing for AMD 
plugins/train/trainer/_base.py