docstr: Consists of::
  
      (inputs)--conv_0-o-conv_1--conv_2-+-(conv_res)--down_sample--
                       |                |
                       o----------------o
  
  conv_0, conv_res is also returned for feature forwarding purpose
code: def layer_op(self, inputs, is_training=True):
      """
      Consists of::
  
          (inputs)--conv_0-o-conv_1--conv_2-+-(conv_res)--down_sample--
                           |                |
                           o----------------o
  
      conv_0, conv_res is also returned for feature forwarding purpose
      """
      conv_0 = Conv(
          n_output_chns=self.n_output_chns,
          kernel_size=self.kernel_size,
          acti_func=self.acti_func,
          with_bias=False,
          feature_normalization="batch",
          **self.conv_param,
      )(inputs, is_training)
      conv_res = ResUnit(
          n_output_chns=self.n_output_chns,
          kernel_size=self.kernel_size,
          acti_func=self.acti_func,
          type_string=self.type_string,
          **self.conv_param,
      )(conv_0, is_training)
      conv_down = Down(
          "Max",
          kernel_size=self.downsample_kernel_size,
          stride=self.downsample_stride,
      )(conv_res)
      return conv_down, conv_0, conv_res
  
file_path: NiftyNet/niftynet/layer/downsample_res_block.py
imports: from __future__ import absolute_import, print_function
  from niftynet.layer.base_layer import TrainableLayer
  from niftynet.layer.convolution import ConvolutionalLayer
  from niftynet.layer.downsample import DownSampleLayer
  from niftynet.layer.residual_unit import ResidualUnit
label_desc: Use image node_id 2 for calling the DownBlock obj's underlying member method code with example usage: obj.layer_op(inputs, is_training) and returns: conv_down,  conv_0,  conv_res