          self.landmarks = self.training_opts.get("landmarks", None)
          self.fixed_producer_dispatcher = None  # Set by FPD when loading
          self._nearest_landmarks = None
          self.processing = ImageManipulation(model_input_size,
                                              model_output_size,
                                              training_opts.get("coverage_ratio", 0.625),
                                              config)
          logger.debug("Initialized %s", self.__class__.__name__)
  
      def set_mask_class(self):
 
</s> remove         self.model_output_size = model_output_size
 </s> add         self.model_output_shapes = model_output_shapes </s> remove             "loss": re.compile(r"([a-zA-Z_]+):.*?(\d+\.\d+)"),
 </s> add             "loss": re.compile(r"[\W]+(\d+)?[\W]+([a-zA-Z\s]*)[\W]+?(\d+\.\d+)"), </s> remove         self.output_size = output_size
 </s> add         self.output_sizes = [shape[1] for shape in output_shapes if shape[2] == 3]
        logger.debug("Output sizes: %s", self.output_sizes) </s> remove     def compile_mask(self, batch):
        """ Compile the mask into training data """
        logger.trace("Compiling Mask: (side: '%s')", self.side)
        mask = batch[-1]
        retval = list()
        for idx in range(len(batch) - 1):
            image = batch[idx]
            retval.append([image, mask])
        return retval

 </s> add  </s> remove                      self.__class__.__name__, model_input_size, model_output_size,
 </s> add                      self.__class__.__name__, model_input_size, model_output_shapes,
                                            model_output_shapes,
          self.landmarks = self.training_opts.get("landmarks", None)
          self.fixed_producer_dispatcher = None  # Set by FPD when loading
          self._nearest_landmarks = None
          self.processing = ImageManipulation(model_input_size,
                                            model_output_shapes,
                                              training_opts.get("coverage_ratio", 0.625),
                                              config)
          logger.debug("Initialized %s", self.__class__.__name__)
  
      def set_mask_class(self):
keep keep keep keep replace keep keep keep keep keep
 Training: Add Multi-Output Support

- Name output nodes of models
- Add support for multiple outputs in models and in training
- Update loss output format for cli and gui
- Sort graphs tabs on training
- Fix analysis graph for new loss names
- Multi output support in convert 
lib/training_data.py