class_docstr: The :class:`QuanConv2dWithBN` class is a quantized convolutional layer with BN, which weights are 'bitW' bits and the output of the previous layer
  are 'bitA' bits while inferencing.
  
  Note that, the bias vector would keep the same.
  
  Parameters
  ----------
  n_filter : int
      The number of filters.
  filter_size : tuple of int
      The filter size (height, width).
  strides : tuple of int
      The sliding window strides of corresponding input dimensions.
      It must be in the same order as the ``shape`` parameter.
  padding : str
      The padding algorithm type: "SAME" or "VALID".
  act : activation function
      The activation function of this layer.
  decay : float
      A decay factor for `ExponentialMovingAverage`.
      Suggest to use a large value for large dataset.
  epsilon : float
      Eplison.
  is_train : boolean
      Is being used for training or inference.
  beta_init : initializer or None
      The initializer for initializing beta, if None, skip beta.
      Usually you should not skip beta unless you know what happened.
  gamma_init : initializer or None
      The initializer for initializing gamma, if None, skip gamma.
  bitW : int
      The bits of this layer's parameter
  bitA : int
      The bits of the output of previous layer
  use_gemm : boolean
      If True, use gemm instead of ``tf.matmul`` for inferencing. (TODO).
  W_init : initializer
      The initializer for the the weight matrix.
  W_init_args : dictionary
      The arguments for the weight matrix initializer.
  data_format : str
      "NHWC" or "NCHW", default is "NHWC".
  dilation_rate : tuple of int
      Specifying the dilation rate to use for dilated convolution.
  in_channels : int
      The number of in channels.
  name : str
      A unique layer name.
  
  Examples
  ---------
  >>> import tensorlayer as tl
  >>> net = tl.layers.Input([50, 256, 256, 3])
  >>> layer = tl.layers.QuanConv2dWithBN(n_filter=64, filter_size=(5,5),strides=(1,1),padding='SAME',name='qcnnbn1')
  >>> print(layer)
  >>> net = tl.layers.QuanConv2dWithBN(n_filter=64, filter_size=(5,5),strides=(1,1),padding='SAME',name='qcnnbn1')(net)
  >>> print(net)
code: def mean_var_with_update(
      self, update_moving_mean, update_moving_variance, mean, variance
  ):
      with tf.control_dependencies(
          [update_moving_mean, update_moving_variance]
      ):
          return tf.identity(mean), tf.identity(variance)
  
file_path: TensorLayer/tensorlayer/layers/convolution/quan_conv_bn.py
imports: import numpy
  import tensorflow
  from tensorflow.python.training import moving_averages
  import tensorlayer
  from tensorlayer import logging
  from tensorlayer.layers.core import Layer
  from tensorlayer.layers.utils import quantize_active_overflow, quantize_weight_overflow
label_desc: Use image node_id 5 for calling the QuanConv2dWithBN obj's underlying member method code with example usage: obj.mean_var_with_update(update_moving_mean, update_moving_variance, mean, variance) and returns: tf,  tf