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.
docstr: Initializes a NoisyLayer object.
  
  Args:
      in_size: Input size for Noisy Layer
      out_size: Output size for Noisy Layer
      sigma0: Initialization value for sigma_b (bias noise)
      activation: Non-linear activation for Noisy Layer
docstr_tok: ["Initializes","a","NoisyLayer","object",".","Args",":","in_size",":","Input","size","for","Noisy","Layer","out_size",":","Output","size","for","Noisy","Layer","sigma0",":","Initialization","value","for","sigma_b","(","bias","noise",")","activation",":","Non-linear","activation","for","Noisy","Layer"]
code: def __init__(
      self,
      in_size: int,
      out_size: int,
      sigma0: float,
      activation: str = "relu",
  ):
      """Initializes a NoisyLayer object.
  
      Args:
          in_size: Input size for Noisy Layer
          out_size: Output size for Noisy Layer
          sigma0: Initialization value for sigma_b (bias noise)
          activation: Non-linear activation for Noisy Layer
      """
      super().__init__()
  
      self.in_size = in_size
      self.out_size = out_size
      self.sigma0 = sigma0
      self.activation = get_activation_fn(activation, framework="torch")
      if self.activation is not None:
          self.activation = self.activation()
  
      sigma_w = nn.Parameter(
          torch.from_numpy(
              np.random.uniform(
                  low=-1.0 / np.sqrt(float(self.in_size)),
                  high=1.0 / np.sqrt(float(self.in_size)),
                  size=[self.in_size, out_size],
              )
          ).float()
      )
      self.register_parameter("sigma_w", sigma_w)
      sigma_b = nn.Parameter(
          torch.from_numpy(
              np.full(
                  shape=[out_size],
                  fill_value=sigma0 / np.sqrt(float(self.in_size)),
              )
          ).float()
      )
      self.register_parameter("sigma_b", sigma_b)
  
      w = nn.Parameter(
          torch.from_numpy(
              np.full(
                  shape=[self.in_size, self.out_size],
                  fill_value=6
                  / np.sqrt(float(in_size) + float(out_size)),
              )
          ).float()
      )
      self.register_parameter("w", w)
      b = nn.Parameter(torch.from_numpy(np.zeros([out_size])).float())
      self.register_parameter("b", b)
  
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 1 to create a new NoisyLayer object from inherited base classes: nn with example: obj = NoisyLayer(in_size, out_size, sigma0, activation)