          if not self._time_stats:
              logger.debug("Collating summary time stamps")
  
              self._time_stats = {
                  sess_id: dict(start_time=np.min(timestamps) if np.any(timestamps) else 0,
                                end_time=np.max(timestamps) if np.any(timestamps) else 0,
                                iterations=timestamps.shape[0] if np.any(timestamps) else 0)
                  for sess_id, timestamps in cast(Dict[int, np.ndarray],
                                                  self._session.get_timestamps(None)).items()}
  
          elif _SESSION.is_training:
              logger.debug("Updating summary time stamps for training session")
 
</s> remove         self.features = dict(lowmem=0, fair=1, best=2)[self.config["features"]]
 </s> add         self.features = {"lowmem": 0, "fair": 1, "best": 2}[self.config["features"]] </s> remove         if summary.tag in ("batch_loss", "batch_total"):  # Pre tf2.3 totals were "batch_total"
 </s> add         if summary.tag == "batch_loss": </s> remove         predicted: List[np.ndarray] = inbound if isinstance(inbound, list) else [inbound]
 </s> add         predicted: T.List[np.ndarray] = inbound if isinstance(inbound, list) else [inbound] </s> remove         kwargs = dict(kernel_size=5, kernel_initializer=self.kernel_initializer)
 </s> add         kwargs = {"kernel_size": 5, "kernel_initializer": self.kernel_initializer} </s> remove         kwargs = dict(kernel_size=5, kernel_initializer=self.kernel_initializer)
 </s> add         kwargs = {"kernel_size": 5, "kernel_initializer": self.kernel_initializer}
                sess_id: {"start_time": np.min(timestamps) if np.any(timestamps) else 0,
                          "end_time": np.max(timestamps) if np.any(timestamps) else 0,
                          "iterations": timestamps.shape[0] if np.any(timestamps) else 0}
          if not self._time_stats:
              logger.debug("Collating summary time stamps")
  
              self._time_stats = {
                sess_id: {"start_time": np.min(timestamps) if np.any(timestamps) else 0,
                          "end_time": np.max(timestamps) if np.any(timestamps) else 0,
                          "iterations": timestamps.shape[0] if np.any(timestamps) else 0}
                sess_id: {"start_time": np.min(timestamps) if np.any(timestamps) else 0,
                          "end_time": np.max(timestamps) if np.any(timestamps) else 0,
                          "iterations": timestamps.shape[0] if np.any(timestamps) else 0}
                sess_id: {"start_time": np.min(timestamps) if np.any(timestamps) else 0,
                          "end_time": np.max(timestamps) if np.any(timestamps) else 0,
                          "iterations": timestamps.shape[0] if np.any(timestamps) else 0}
                  for sess_id, timestamps in cast(Dict[int, np.ndarray],
                                                  self._session.get_timestamps(None)).items()}
  
          elif _SESSION.is_training:
              logger.debug("Updating summary time stamps for training session")
keep keep keep keep replace replace replace keep keep keep keep keep
 Remove plaidML support (#1325)

* Remove PlaidML reference from readme files

* Remove AMD option from installers

* remove amd requirements and update setup.py

* remove plaidml test from CI workflow

* gpustats: remove plaidml backend

* plaid removals:
  - faceswap.py - python version check
  - setup.cfg - plaidml typing ignore
  - lib.keras_utils - All plaid code
  - lib.launcher.py - All plaidml checks and configuration

* remove tf2.2 specific code from GUI event reader

* lib.model - remove all plaidml implementations

* plugins.extract - remove plaidml code

* plugins.train remove plaidml code

* lib.convert - remove plaidml code

* tools.model: remove plaidml code

* Remove plaidML tests from unit tests

* remove plaidml_utils and docsting cleanups

* Remove plaidML refs from configs

* fix keras imports 
lib/gui/analysis/stats.py