class_docstr: ### Description
  Implementation of HolisticNet detailed in
  Fidon, L. et. al. (2017) Generalised Wasserstein Dice Score for Imbalanced
  Multi-class Segmentation using Holistic Convolutional Networks.
  MICCAI 2017 (BrainLes)
  
  ### Diagram Blocks
  [CONV]          -   3x3x3 Convolutional layer in form: Activation(Convolution(X))
                      where X = input tensor or output of previous layer
  
                      and Activation is a function which includes:
  
                          a) Batch-Norm
                          b) Activation Function (Elu, ReLu, PreLu, Sigmoid, Tanh etc.)
  
  [D-CONV(d)]     -   3x3x3 Convolutional layer with dilated convolutions with blocks in
                       pre-activation mode: D-Convolution(Activation(X))
                       see He et al., "Identity Mappings in Deep Residual Networks", ECCV '16
  
                       dilation factor = d
                       D-CONV(2) : dilated convolution with dilation factor 2
  
                       repeat factor = r
                       e.g.
                       (2)[D-CONV(d)]     : 2 dilated convolutional layers in a row [D-CONV] -> [D-CONV]
                       { (2)[D-CONV(d)] } : 2 dilated convolutional layers within residual block
  
  [SCORE]         -   Batch-Norm + 3x3x3 Convolutional layer  + Activation function + 1x1x1 Convolutional layer
  
  [MERGE]         -   Channel-wise merging
  
  
  ### Diagram
  
  MULTIMODAL INPUT ----- [CONV]x3 -----[D-CONV(2)]x3 ----- MaxPooling ----- [CONV]x3 -----[D-CONV(2)]x3
                                      |                   |                          |                  |
                                    [SCORE]             [SCORE]                    [SCORE]            [SCORE]
                                      |                   |                          |                  |
                                      -------------------------------------------------------------------
                                                                      |
                                                                   [MERGE] --> OUTPUT
  
  ### Constraints
  - Input image size should be divisible by 8
  
  ### Comments
  - The network returns only the merged output, so the loss will be applied only to this
  (different from the referenced paper)
docstr: :param num_classes: int, number of channels of output
  :param w_initializer: weight initialisation for network
  :param w_regularizer: weight regularisation for network
  :param b_initializer: bias initialisation for network
  :param b_regularizer: bias regularisation for network
  :param acti_func: activation function to use
  :param name: layer name
docstr_tok: [":","param","num_classes",":","int",",","number","of","channels","of","output",":","param","w_initializer",":","weight","initialisation","for","network",":","param","w_regularizer",":","weight","regularisation","for","network",":","param","b_initializer",":","bias","initialisation","for","network",":","param","b_regularizer",":","bias","regularisation","for","network",":","param","acti_func",":","activation","function","to","use",":","param","name",":","layer","name"]
code: def __init__(
      self,
      num_classes,
      w_initializer=None,
      w_regularizer=None,
      b_initializer=None,
      b_regularizer=None,
      acti_func="elu",
      name="HolisticNet",
  ):
      """
  
      :param num_classes: int, number of channels of output
      :param w_initializer: weight initialisation for network
      :param w_regularizer: weight regularisation for network
      :param b_initializer: bias initialisation for network
      :param b_regularizer: bias regularisation for network
      :param acti_func: activation function to use
      :param name: layer name
      """
      super(HolisticNet, self).__init__(
          num_classes=num_classes,
          acti_func=acti_func,
          name=name,
          w_initializer=w_initializer,
          w_regularizer=w_regularizer,
          b_initializer=b_initializer,
          b_regularizer=b_regularizer,
      )
  
      self.num_res_blocks = [3, 3, 3, 3]
      self.num_features = [70] * 4
      self.num_fea_score_layers = [[70, 140]] * 4
  
imports: from __future__ import absolute_import, print_function
  import tensorflow
  from niftynet.layer.base_layer import TrainableLayer
  from niftynet.layer.convolution import ConvLayer
  from niftynet.layer.convolution import ConvolutionalLayer
  from niftynet.layer.dilatedcontext import DilatedTensor
  from niftynet.layer.downsample import DownSampleLayer
  from niftynet.layer.upsample import UpSampleLayer
  from niftynet.network.base_net import BaseNet
  from niftynet.network.highres3dnet import HighResBlock
label_desc: Use image node_id 1 to create a new HolisticNet object from inherited base classes: BaseNet with example: obj = HolisticNet(num_classes, w_initializer, w_regularizer, b_initializer, b_regularizer, acti_func, name)