          queue_in, queue_out = self.make_queues(side, is_preview, is_timelapse)
          training_size = self.training_opts.get("training_size", 256)
          batch_shape = list((
              (batchsize, training_size, training_size, 3),  # sample images
              (batchsize, self.model_input_size, self.model_input_size, 3),
              (batchsize, self.model_output_size, self.model_output_size, 3)))
          if self.mask_class:
              batch_shape.append((self.batchsize, self.model_output_size, self.model_output_size, 1))
  
          self.fixed_producer_dispatcher = FixedProducerDispatcher(
              method=self.load_batches,
              shapes=batch_shape,
              in_queue=queue_in,
 
</s> remove             batch = self.compile_mask(batch)
        images = batch[1]
 </s> add             mask = batch[-1]
            batch = [[feed, mask], batch]
            images = [images, mask] </s> remove         samples = batch[0]
        batch = batch[1:]   # Remove full size samples from batch
 </s> add         samples, feed = batch[:2] </s> remove         self.model_output_size = model_output_size
 </s> add         self.model_output_shapes = model_output_shapes </s> remove                                             model_output_size,
 </s> add                                             model_output_shapes,
            (batchsize, self.model_input_size, self.model_input_size, 3)))
        # Add the output shapes
        batch_shape.extend(tuple([(batchsize, ) + shape for shape in self.model_output_shapes]))
        logger.debug("Batch shapes: %s", batch_shape)
          queue_in, queue_out = self.make_queues(side, is_preview, is_timelapse)
          training_size = self.training_opts.get("training_size", 256)
          batch_shape = list((
              (batchsize, training_size, training_size, 3),  # sample images
            (batchsize, self.model_input_size, self.model_input_size, 3)))
        # Add the output shapes
        batch_shape.extend(tuple([(batchsize, ) + shape for shape in self.model_output_shapes]))
        logger.debug("Batch shapes: %s", batch_shape)
            (batchsize, self.model_input_size, self.model_input_size, 3)))
        # Add the output shapes
        batch_shape.extend(tuple([(batchsize, ) + shape for shape in self.model_output_shapes]))
        logger.debug("Batch shapes: %s", batch_shape)
            (batchsize, self.model_input_size, self.model_input_size, 3)))
        # Add the output shapes
        batch_shape.extend(tuple([(batchsize, ) + shape for shape in self.model_output_shapes]))
        logger.debug("Batch shapes: %s", batch_shape)
            (batchsize, self.model_input_size, self.model_input_size, 3)))
        # Add the output shapes
        batch_shape.extend(tuple([(batchsize, ) + shape for shape in self.model_output_shapes]))
        logger.debug("Batch shapes: %s", batch_shape)
  
          self.fixed_producer_dispatcher = FixedProducerDispatcher(
              method=self.load_batches,
              shapes=batch_shape,
              in_queue=queue_in,
keep keep keep keep replace replace replace 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