class_docstr: A builder class that allows to builds a multitrack unet model
  estimator. The built model estimator has a different behaviour when
  used in a train/eval mode and in predict mode.
  
  * In train/eval mode:
      It takes as input and outputs magnitude spectrogram
  * In predict mode:
      It takes as input and outputs waveform.
      The whole separation process is then done in this function
      for performance reason: it makes it possible to run the whole
      separation process (including STFT and inverse STFT) on GPU.
  
  Example:
  >>> from spleeter.model import EstimatorSpecBuilder
  >>> builder = EstimatorSpecBuilder()
  >>> builder.build_predict_model()
  >>> builder.build_evaluation_model()
  >>> builder.build_train_model()
  
  >>> from spleeter.model import model_fn
  >>> estimator = tf.estimator.Estimator(model_fn=model_fn, ...)
class_docstr_tok: ["A","builder","class","that","allows","to","builds","a","multitrack","unet","model","estimator",".","The","built","model","estimator","has","a","different","behaviour","when","used","in","a","train\/eval","mode","and","in","predict","mode",".","*","In","train\/eval","mode",":","It","takes","as","input","and","outputs","magnitude","spectrogram","*","In","predict","mode",":","It","takes","as","input","and","outputs","waveform",".","The","whole","separation","process","is","then","done","in","this","function","for","performance","reason",":","it","makes","it","possible","to","run","the","whole","separation","process","(","including","STFT","and","inverse","STFT",")","on","GPU",".","Example",":",">",">",">","from","spleeter.model","import","EstimatorSpecBuilder",">",">",">","builder","=","EstimatorSpecBuilder","(",")",">",">",">","builder.build_predict_model","(",")",">",">",">","builder.build_evaluation_model","(",")",">",">",">","builder.build_train_model","(",")",">",">",">","from","spleeter.model","import","model_fn",">",">",">","estimator","=","tf.estimator.Estimator","(","model_fn=model_fn",",","...",")"]
docstr: Construct tensorflow loss and metrics
  
  Parameters:
      labels (Dict):
          Dictionary of target outputs (key: instrument name,
          value: ground truth spectrogram of the instrument)
  
  Returns:
      Tuple[tf.Tensor, Dict]:
          Tensorflow (loss, metrics) tuple.
docstr_tok: ["Construct","tensorflow","loss","and","metrics","Parameters",":","labels","(","Dict",")",":","Dictionary","of","target","outputs","(","key",":","instrument","name",",","value",":","ground","truth","spectrogram","of","the","instrument",")","Returns",":","Tuple","[","tf.Tensor",",","Dict","]",":","Tensorflow","(","loss",",","metrics",")","tuple","."]
code: def _build_loss(self, labels: Dict) -> Tuple[tf.Tensor, Dict]:
      """
      Construct tensorflow loss and metrics
  
      Parameters:
          labels (Dict):
              Dictionary of target outputs (key: instrument name,
              value: ground truth spectrogram of the instrument)
  
      Returns:
          Tuple[tf.Tensor, Dict]:
              Tensorflow (loss, metrics) tuple.
      """
      output_dict = self.model_outputs
      loss_type = self._params.get("loss_type", self.L1_MASK)
      if loss_type == self.L1_MASK:
          losses = {
              name: tf.reduce_mean(tf.abs(output - labels[name]))
              for name, output in output_dict.items()
          }
      elif loss_type == self.WEIGHTED_L1_MASK:
          losses = {
              name: tf.reduce_mean(
                  tf.reduce_mean(
                      labels[name], axis=[1, 2, 3], keep_dims=True
                  )
                  * tf.abs(output - labels[name])
              )
              for name, output in output_dict.items()
          }
      else:
          raise ValueError(f"Unkwnown loss type: {loss_type}")
      loss = tf.reduce_sum(list(losses.values()))
      # Add metrics for monitoring each instrument.
      metrics = {
          k: tf.compat.v1.metrics.mean(v) for k, v in losses.items()
      }
      metrics["absolute_difference"] = tf.compat.v1.metrics.mean(loss)
      return loss, metrics
  
imports: import importlib
  from typing import Any, Dict, Optional, Tuple
  import tensorflow
  from tensorflow.signal import hann_window, inverse_stft, stft
  from ..utils.tensor import pad_and_partition, pad_and_reshape
label_desc: Use image node_id 3 for calling the EstimatorSpecBuilder obj's underlying member method code with example usage: obj._build_loss(labels) and returns: loss,  metrics