          optimizer = _Optimizer(self.config["optimizer"],
                                 self.config["learning_rate"],
                                 self.config.get("clipnorm", False),
                                 self._args).optimizer
          if self._settings.use_mixed_precision:
              optimizer = self._settings.loss_scale_optimizer(optimizer)
          if get_backend() == "amd":
              self._rewrite_plaid_outputs()
 
</s> remove     if d_type == float:
 </s> add     if isinstance(round_to, list):
        # Lock to nearest item
        var.set(min(round_to, key=lambda x: abs(x-float(value))))
    elif d_type == float: </s> remove             print_fn = lambda x: logger.verbose("%s", x)  # print to logger
 </s> add             # print to logger
            print_fn = lambda x: logger.verbose("%s", x)  # noqa </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)}
                               10 ** int(self.config["epsilon_exponent"]),
          optimizer = _Optimizer(self.config["optimizer"],
                                 self.config["learning_rate"],
                                 self.config.get("clipnorm", False),
                               10 ** int(self.config["epsilon_exponent"]),
                                 self._args).optimizer
          if self._settings.use_mixed_precision:
              optimizer = self._settings.loss_scale_optimizer(optimizer)
          if get_backend() == "amd":
              self._rewrite_plaid_outputs()
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/model/_base.py