docstr: :param images: tensor, input to the BottleNeck block
  :param is_training: boolean, True if network is in training mode
  :return: tensor, output of the BottleNeck block
docstr_tok: [":","param","images",":","tensor",",","input","to","the","BottleNeck","block",":","param","is_training",":","boolean",",","True","if","network","is","in","training","mode",":","return",":","tensor",",","output","of","the","BottleNeck","block"]
code: def layer_op(self, images, is_training=True):
      """
  
      :param images: tensor, input to the BottleNeck block
      :param is_training: boolean, True if network is in training mode
      :return: tensor, output of the BottleNeck block
      """
      layers = self.create(images.shape[-1])
      se = ChannelSELayer()
      if self.n_output_chns == images.shape[-1]:
          out = layers.conv[0](images, is_training)
          out = layers.conv[1](out, is_training)
          out = layers.conv[2](out, is_training)
          out = se(out)
          out = out + images
      else:
          tmp = tf.nn.relu(layers.common_bn(images, is_training))
          out = layers.conv[0](tmp, is_training)
          out = layers.conv[1](out, is_training)
          out = layers.conv[2](out, is_training)
          out = se(out)
          out = layers.conv_shortcut(tmp, is_training) + out
      print(out.shape)
      return out
  
imports: from __future__ import absolute_import, print_function
  import functools
  from collections import namedtuple
  import tensorflow
  from niftynet.layer import layer_util
  from niftynet.layer.base_layer import TrainableLayer
  from niftynet.layer.bn import BNLayer
  from niftynet.layer.convolution import ConvolutionalLayer
  from niftynet.layer.fully_connected import FCLayer
  from niftynet.layer.squeeze_excitation import ChannelSELayer
  from niftynet.network.base_net import BaseNet
label_desc: Use image node_id 3 for calling the BottleneckBlock obj's underlying member method code with example usage: obj.layer_op(images, is_training) and returns: out