              pingpong=self.args.pingpong,
              memory_saving_gradients=self.args.memory_saving_gradients,
              predict=False)
          logger.debug("Loaded Model")
          return model
  
 
</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) </s> remove                      memory_saving_gradients, predict)
 </s> add                      memory_saving_gradients, optimizer_savings, predict)
            optimizer_savings=self.args.optimizer_savings,
              pingpong=self.args.pingpong,
              memory_saving_gradients=self.args.memory_saving_gradients,
            optimizer_savings=self.args.optimizer_savings,
              predict=False)
          logger.debug("Loaded Model")
          return model
  
keep add 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 
scripts/train.py