code: def get_dorefa(bitW, bitA, bitG):
      """
      Return the three quantization functions fw, fa, fg, for weights, activations and gradients respectively
      """
  
      def quantize(x, k):
          n = float(2**k - 1)
  
          @tf.custom_gradient
          def _quantize(x):
              return tf.round(x * n) / n, lambda dy: dy
  
          return _quantize(x)
  
      def fw(x):
          if bitW == 32:
              return x
  
          if bitW == 1:  # BWN
              E = tf.stop_gradient(tf.reduce_mean(tf.abs(x)))
  
              @tf.custom_gradient
              def _sign(x):
                  return (
                      tf.where(
                          tf.equal(x, 0),
                          tf.ones_like(x),
                          tf.sign(x / E),
                      )
                      * E,
                      lambda dy: dy,
                  )
  
              return _sign(x)
  
          x = tf.tanh(x)
          x = x / tf.reduce_max(tf.abs(x)) * 0.5 + 0.5
          return 2 * quantize(x, bitW) - 1
  
      def fa(x):
          if bitA == 32:
              return x
          return quantize(x, bitA)
  
      def fg(x):
          if bitG == 32:
              return x
  
          @tf.custom_gradient
          def _identity(input):
              def grad_fg(x):
                  rank = x.get_shape().ndims
                  assert rank is not None
                  maxx = tf.reduce_max(
                      tf.abs(x), list(range(1, rank)), keep_dims=True
                  )
                  x = x / maxx
                  n = float(2**bitG - 1)
                  x = (
                      x * 0.5
                      + 0.5
                      + tf.random_uniform(
                          tf.shape(x), minval=-0.5 / n, maxval=0.5 / n
                      )
                  )
                  x = tf.clip_by_value(x, 0.0, 1.0)
                  x = quantize(x, bitG) - 0.5
                  return x * maxx * 2
  
              return input, grad_fg
  
          return _identity(x)
  
      return fw, fa, fg
  
label_desc: Use image node_id 1 for calling a global function with example usage: get_dorefa(bitW, bitA, bitG) and returns: fw,  fa,  fg, _quantize, unknown, quantize, _identity, unknown,  function, x, _sign, x, x, input,  grad_fg, unknown,  function, unknown