          ------
          FaceswapError
              If a NaN is detected, a :class:`FaceswapError` will be raised
          """
          split = len(loss) // 2
          combined_loss = [sum(loss[:split]), sum(loss[split:])]
          self._model.add_history(combined_loss)
          logger.trace("original loss: %s, comibed_loss: %s", loss, combined_loss)
          return combined_loss
 
</s> remove                      "arguments: %s", self.__class__.__name__, optimizer, learning_rate, clipnorm,
                     arguments)
 </s> add                      "epsilon: %s, arguments: %s)", self.__class__.__name__,
                     optimizer, learning_rate, clipnorm, epsilon, arguments) </s> remove     def __init__(self, optimizer, learning_rate, clipnorm, arguments):
 </s> add     def __init__(self, optimizer, learning_rate, clipnorm, epsilon, arguments): </s> remove         base_kwargs = {"adam": dict(beta_1=0.5, beta_2=0.99),
                       "nadam": dict(beta_1=0.5, beta_2=0.99),
                       "rms-prop": dict()}
 </s> add         base_kwargs = {"adam": dict(beta_1=0.5, beta_2=0.99, epsilon=epsilon),
                       "nadam": dict(beta_1=0.5, beta_2=0.99, epsilon=epsilon),
                       "rms-prop": dict(epsilon=epsilon)}
        # NaN protection
        if self._config["nan_protection"] and not all(np.isfinite(val) for val in loss):
            logger.critical("NaN Detected. Loss: %s", loss)
            raise FaceswapError("A NaN was detected and you have NaN protection enabled. Training "
                                "has been terminated.")

          ------
          FaceswapError
              If a NaN is detected, a :class:`FaceswapError` will be raised
          """
        # NaN protection
        if self._config["nan_protection"] and not all(np.isfinite(val) for val in loss):
            logger.critical("NaN Detected. Loss: %s", loss)
            raise FaceswapError("A NaN was detected and you have NaN protection enabled. Training "
                                "has been terminated.")

          split = len(loss) // 2
          combined_loss = [sum(loss[:split]), sum(loss[split:])]
          self._model.add_history(combined_loss)
          logger.trace("original loss: %s, comibed_loss: %s", loss, combined_loss)
          return combined_loss
keep keep keep add keep keep keep keep keep
 Training updates:
  - Expose optimizer epsilon param
  - Add NaN protection
GUI - slider - add support for discreet values 
plugins/train/trainer/_base.py