class_docstr: A Layer that adds learnable Noise to some previous layer's outputs.
  
  Consists of:
  - a common dense layer: y = w^{T}x + b
  - a noisy layer: y = (w + \epsilon_w*\sigma_w)^{T}x +
      (b+\epsilon_b*\sigma_b)
  , where \epsilon are random variables sampled from factorized normal
  distributions and \sigma are trainable variables which are expected to
  vanish along the training procedure.
code: def forward(self, inputs: TensorType) -> TensorType:
      epsilon_in = self._f_epsilon(
          torch.normal(
              mean=torch.zeros([self.in_size]),
              std=torch.ones([self.in_size]),
          ).to(inputs.device)
      )
      epsilon_out = self._f_epsilon(
          torch.normal(
              mean=torch.zeros([self.out_size]),
              std=torch.ones([self.out_size]),
          ).to(inputs.device)
      )
      epsilon_w = torch.matmul(
          torch.unsqueeze(epsilon_in, -1),
          other=torch.unsqueeze(epsilon_out, 0),
      )
      epsilon_b = epsilon_out
  
      action_activation = (
          torch.matmul(inputs, self.w + self.sigma_w * epsilon_w)
          + self.b
          + self.sigma_b * epsilon_b
      )
  
      if self.activation is not None:
          action_activation = self.activation(action_activation)
      return action_activation
  
file_path: ray/rllib/models/torch/modules/noisy_layer.py
imports: import numpy
  from ray.rllib.models.utils import get_activation_fn
  from ray.rllib.utils.framework import try_import_torch, TensorType
label_desc: Use image node_id 2 for calling the NoisyLayer obj's underlying member method code with example usage: obj.forward(inputs) and returns: action_activation