class_docstr: Add random noise to the embedding and include a corresponding loss.
code: def call(self, inputs, training=True):
      input, global_step = inputs
      embedding_mean = self.dense_mean(input)
      embedding_stddev = self.dense_stddev(input)
      embedding = self.combine(
          [embedding_mean, embedding_stddev], training=training
      )
      mean_sq = embedding_mean * embedding_mean
      stddev_sq = embedding_stddev * embedding_stddev
      kl = mean_sq + stddev_sq - tf.math.log(stddev_sq + 1e-20) - 1
      anneal_steps = (
          self._annealing_final_step - self._annealing_start_step
      )
      if anneal_steps > 0:
          current_step = (
              tf.cast(global_step, tf.float32)
              - self._annealing_start_step
          )
          anneal_frac = tf.maximum(0.0, current_step) / anneal_steps
          kl_scale = tf.minimum(1.0, anneal_frac * anneal_frac)
      else:
          kl_scale = 1.0
      self.add_loss(0.5 * kl_scale * tf.reduce_mean(kl))
      return embedding
  
imports: from deepchem.models import KerasModel, layers
  from heapq import heappush, heappushpop
  import numpy
  import tensorflow
  from tensorflow.keras.layers import Input, Layer, Dense, Dropout, GRU, Lambda, Conv1D, Flatten, BatchNormalization
label_desc: Use image node_id 2 for calling the VariationalRandomizer obj's underlying member method code with example usage: obj.call(inputs, training) and returns: embedding