          Might not be the optimal value for speed, which is hard to predict due to numpy
          optimizations.
          """
          # Use :func:`np.finfo(dtype).eps` if you are worried about accuracy and want to be safe.
          epsilon = np.finfo(self._dtype).tiny
          # If this produces an OverflowError, make epsilon larger:
          retval = int(np.log(epsilon) / np.log(1 - self._alpha)) + 1
          logger.debug("row_size: %s", retval)
          return retval
  
 
</s> remove 
        Notes
        -----
        There are additional parameters for this function. some of the 'modes' for edge behavior
        do not yet have a gradient definition in the Theano tree and cannot be used for learning
        """

        kernel = [self.kernel_size, self.kernel_size]
        y_true = K.reshape(y_true, [-1] + list(self._int_shape(y_pred)[1:]))
        y_pred = K.reshape(y_pred, [-1] + list(self._int_shape(y_pred)[1:]))
        patches_pred = self.extract_image_patches(y_pred,
                                                  kernel,
                                                  kernel,
                                                  'valid',
                                                  self.dim_ordering)
        patches_true = self.extract_image_patches(y_true,
                                                  kernel,
                                                  kernel,
                                                  'valid',
                                                  self.dim_ordering)

        # Get mean
        u_true = K.mean(patches_true, axis=-1)
        u_pred = K.mean(patches_pred, axis=-1)
        # Get variance
        var_true = K.var(patches_true, axis=-1)
        var_pred = K.var(patches_pred, axis=-1)
        # Get standard deviation
        covar_true_pred = K.mean(
            patches_true * patches_pred, axis=-1) - u_true * u_pred

        ssim = (2 * u_true * u_pred + self.c_1) * (
            2 * covar_true_pred + self.c_2)
        denom = (K.square(u_true) + K.square(u_pred) + self.c_1) * (
            var_pred + var_true + self.c_2)
        ssim /= denom  # no need for clipping, c_1 + c_2 make the denorm non-zero
        return (1.0 - ssim) / 2.0

    @staticmethod
    def _preprocess_padding(padding):
        """Convert keras padding to tensorflow padding.

        Parameters
        ----------
        padding: string,
            `"same"` or `"valid"`.

        Returns
        -------
        str
            `"SAME"` or `"VALID"`.

        Raises
        ------
        ValueError
            If `padding` is invalid.
 </s> add  </s> remove         tag = "v{}.{}.{}".format(self._url_section, self._git_model_id, self._model_version)
        retval = "{}/{}/{}.zip".format(self._url_base, tag, self._model_full_name)
 </s> add         tag = f"v{self._url_section}.{self._git_model_id}.{self._model_version}"
        retval = f"{self._url_base}/{tag}/{self._model_full_name}.zip" </s> remove             retval = KerasModel(model_inputs, model, name="{}_inference".format(saved_model.name))
 </s> add             retval = KerasModel(model_inputs, model, name=f"{saved_model.name}_inference") </s> remove class ConvolutionAware(initializers.Initializer):
 </s> add class ConvolutionAware(initializers.Initializer):  # pylint: disable=no-member </s> remove         step.setdefault("loss", list()).append(summary.simple_value)
 </s> add         loss = summary.simple_value
        if not loss:
            # Need to convert a tensor to a float for TF2.8 logged data. This maybe due to change
            # in logging or may be due to work around put in place in FS training function for the
            # following bug in TF 2.8 when writing records:
            #  https://github.com/keras-team/keras/issues/16173
            loss = float(tf.make_ndarray(summary.tensor))

        step.setdefault("loss", []).append(loss)

        epsilon = np.finfo(self._dtype).tiny  # pylint:disable=no-member
          Might not be the optimal value for speed, which is hard to predict due to numpy
          optimizations.
          """
          # Use :func:`np.finfo(dtype).eps` if you are worried about accuracy and want to be safe.
        epsilon = np.finfo(self._dtype).tiny  # pylint:disable=no-member
          # If this produces an OverflowError, make epsilon larger:
          retval = int(np.log(epsilon) / np.log(1 - self._alpha)) + 1
          logger.debug("row_size: %s", retval)
          return retval
  
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