class_docstr: The :class:`TernaryConv2d` class is a 2D ternary CNN layer, which weights are either -1 or 1 or 0 while inference.
  
  Note that, the bias vector would not be tenarized.
  
  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.
  act : activation function
      The activation function of this layer.
  padding : str
      The padding algorithm type: "SAME" or "VALID".
  use_gemm : boolean
      If True, use gemm instead of ``tf.matmul`` for inference.
      TODO: support gemm
  data_format : str
      "channels_last" (NHWC, default) or "channels_first" (NCHW).
  dilation_rate : tuple of int
      Specifying the dilation rate to use for dilated convolution.
  W_init : initializer
      The initializer for the the weight matrix.
  b_init : initializer or None
      The initializer for the the bias vector. If None, skip biases.
  in_channels : int
      The number of in channels.
  name : None or str
      A unique layer name.
  
  Examples
  ---------
  With TensorLayer
  
  >>> net = tl.layers.Input([8, 12, 12, 32], name='input')
  >>> ternaryconv2d = tl.layers.QuanConv2d(
  ...     n_filter=64, filter_size=(5, 5), strides=(1, 1), act=tf.nn.relu, padding='SAME', name='ternaryconv2d'
  ... )(net)
  >>> print(ternaryconv2d)
  >>> output shape : (8, 12, 12, 64)
code: def __init__(
      self,
      n_filter=32,
      filter_size=(3, 3),
      strides=(1, 1),
      act=None,
      padding="SAME",
      use_gemm=False,
      data_format="channels_last",
      dilation_rate=(1, 1),
      W_init=tl.initializers.truncated_normal(stddev=0.02),
      b_init=tl.initializers.constant(value=0.0),
      in_channels=None,
      name=None,  # 'ternary_cnn2d',
  ):
      super().__init__(name, act=act)
      self.n_filter = n_filter
      self.filter_size = filter_size
      self.strides = self._strides = strides
      self.padding = padding
      self.use_gemm = use_gemm
      self.data_format = data_format
      self.dilation_rate = self._dilation_rate = dilation_rate
      self.W_init = W_init
      self.b_init = b_init
      self.in_channels = in_channels
  
      if self.in_channels:
          self.build(None)
          self._built = True
  
      logging.info(
          "TernaryConv2d %s: n_filter: %d filter_size: %s strides: %s pad: %s act: %s"
          % (
              self.name,
              n_filter,
              str(filter_size),
              str(strides),
              padding,
              self.act.__name__
              if self.act is not None
              else "No Activation",
          )
      )
  
      if use_gemm:
          raise Exception(
              "TODO. The current version use tf.matmul for inferencing."
          )
  
      if len(self.strides) != 2:
          raise ValueError("len(strides) should be 2.")
  
file_path: TensorLayer/tensorlayer/layers/convolution/ternary_conv.py
imports: import tensorflow
  import tensorlayer
  from tensorlayer import logging
  from tensorlayer.decorators import deprecated_alias
  from tensorlayer.layers.core import Layer
  from tensorlayer.layers.utils import compute_alpha, ternary_operation
label_desc: Use image node_id 1 to create a new TernaryConv2d object from inherited base classes: Layer with example: obj = TernaryConv2d(n_filter, filter_size, strides, act, padding, use_gemm, data_format, dilation_rate, W_init, b_init, in_channels, name)