          logger.debug("Formatting stats")
          retval = []
          for summary in compiled_stats:
              hrs, mins, secs = self._convert_time(summary["elapsed"])
              stats = dict()
              for key in summary:
                  if key not in ("start", "end", "elapsed", "rate"):
                      stats[key] = summary[key]
                      continue
                  stats["start"] = time.strftime("%x %X", time.localtime(summary["start"]))
 
</s> remove                 stats["elapsed"] = "{}:{}:{}".format(hrs, mins, secs)
                stats["rate"] = "{0:.1f}".format(summary["rate"])
 </s> add                 stats["elapsed"] = f"{hrs}:{mins}:{secs}"
                stats["rate"] = f"{summary['rate']:.1f}" </s> remove             retval = dict()
 </s> add             retval = {} </s> remove             method = getattr(self, "_calc_{}".format(selection))
 </s> add             method = getattr(self, f"_calc_{selection}") </s> remove         loss_keys = [key
                     for key in self.display_item.get_loss_keys(Session.session_ids[-1])
                     if key != "total"]
 </s> add         loss_keys = self.display_item.get_loss_keys(Session.session_ids[-1])
        if not loss_keys:
            # Reload if we attempt to get loss keys before data is written
            logger.debug("Waiting for Session Data to become available to graph")
            self.after(1000, self.display_item_process)
            return

        loss_keys = [key for key in loss_keys if key != "total"] </s> remove             hrs = "{0:02d}".format(hrs)
        mins = "{0:02d}".format((int(timestamp % 3600) // 60))
        secs = "{0:02d}".format((int(timestamp % 3600) % 60))
 </s> add             hrs = f"{hrs:02d}"
        mins = f"{(int(timestamp % 3600) // 60):02d}"
        secs = f"{(int(timestamp % 3600) % 60):02d}"
            stats = {}
          logger.debug("Formatting stats")
          retval = []
          for summary in compiled_stats:
              hrs, mins, secs = self._convert_time(summary["elapsed"])
            stats = {}
              for key in summary:
                  if key not in ("start", "end", "elapsed", "rate"):
                      stats[key] = summary[key]
                      continue
                  stats["start"] = time.strftime("%x %X", time.localtime(summary["start"]))
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 
lib/gui/analysis/stats.py