code: def test_module_ema(self):
      module = objax.nn.BatchNorm0D(3)
      module_ema = [
          objax.optimizer.ExponentialMovingAverageModule(
              module, momentum=0.9, eps=1e-3, debias=False
          ),
          objax.optimizer.ExponentialMovingAverageModule(
              module, momentum=0.9, eps=1e-3, debias=True
          ),
          objax.optimizer.ExponentialMovingAverageModule(
              module, momentum=0.999, eps=1e-3, debias=False
          ),
      ]
      vc_ema = [
          objax.optimizer.ExponentialMovingAverage(
              module.vars(), momentum=0.9, eps=1e-3, debias=False
          ),
          objax.optimizer.ExponentialMovingAverage(
              module.vars(), momentum=0.9, eps=1e-3, debias=True
          ),
          objax.optimizer.ExponentialMovingAverage(
              module.vars(), momentum=0.999, eps=1e-3, debias=False
          ),
      ]
      g = objax.random.Generator()
      for it in range(2):
          module.beta.assign(
              objax.random.uniform(module.beta.value.shape, g)
          )
          module.running_mean.assign(
              objax.random.uniform(module.running_mean.value.shape, g)
          )
          for m, v in zip(module_ema, vc_ema):
              m.update_ema()
              v()
  
      x = objax.random.normal((4, 3), generator=g)
      for m, v in zip(module_ema, vc_ema):
          y_m = m(x, training=False)
          y_v = v.replace_vars(module)(x, training=False)
          self.assertEqual(y_m.tolist(), y_v.tolist())
  
imports: import math
  import unittest
  import jax.numpy
  import numpy
  import objax
  from objax.variable import TrainVar, VarCollection
label_desc: Use image node_id 3 for calling the TestEma obj's underlying member method code with example usage: obj.test_module_ema() without return types