docs: def _build(self, input_module, middle_modules, head_module):
          """
          TBD
          """
          input_layer = self._build_input_layer(input_module)
          middle_layers = self._build_middle_layers(middle_modules)
  
          # Construct list of layers
          layers = [input_layer]
          if middle_layers is not None:
              layers += middle_layers
          if not self.config["skip_head"]:
              head = self._build_task_head(head_module)
              layers.append(head)
  
          # Construct network
          if len(layers) > 1:
              self.network = nn.Sequential(*layers)
          else:
              self.network = layers[0]
  
          # Construct loss module
          loss_weights = self.config["train_config"]["loss_weights"]
          if loss_weights is not None and self.config["verbose"]:
              print(f"Using class weight vector {loss_weights}...")
          reduction = self.config["train_config"]["loss_fn_reduction"]
          self.criteria = SoftCrossEntropyLoss(
              weight=self._to_torch(loss_weights, dtype=torch.FloatTensor),
              reduction=reduction,
          )