  from lib.model.backup_restore import Backup
  from lib.model.losses import DSSIMObjective, PenalizedLoss
  from lib.model.nn_blocks import NNBlocks
  from lib.multithreading import MultiThread
  from lib.utils import deprecation_warning, FaceswapError
  from plugins.train._config import Config
  
  logger = logging.getLogger(__name__)  # pylint: disable=invalid-name
  _CONFIG = None
 
</s> remove from keras.optimizers import Adam
 </s> add  </s> remove                    "\n3) Try Memory Saving Gradients and/or Ping Pong Training."
 </s> add                    "\n3) Try 'Memory Saving Gradients' and/or 'Optimizer Savings' and/or 'Ping "
                   "Pong Training'." </s> remove         return Adam(**opt_kwargs)
 </s> add         return Adam(**opt_kwargs, cpu_mode=self.optimizer_savings)
from lib.model.optimizers import Adam
  from lib.model.backup_restore import Backup
  from lib.model.losses import DSSIMObjective, PenalizedLoss
  from lib.model.nn_blocks import NNBlocks
from lib.model.optimizers import Adam
  from lib.multithreading import MultiThread
  from lib.utils import deprecation_warning, FaceswapError
  from plugins.train._config import Config
  
  logger = logging.getLogger(__name__)  # pylint: disable=invalid-name
  _CONFIG = None
keep keep add keep keep keep keep keep keep
 Training improvements

Add Optimizer Savings option to offload some optimizer calculations to the CPU
Add output_shape to NNMeta class for referencing when building models 
plugins/train/model/_base.py