class_docstr: Decoding function which scales the input, adds shift and then applies
  `relu`, `softplus`, `sigmoid` or nothing on its input:
  `result = operation(input * scale + shift)`
  
  Members:
      scale: a scalar with which input is multiplied before being shifted.
          Defaults to 1.
      shift: a scalar which is added to the scaled input before performing
          the operation. Defaults to 0.
      operation: which operation to perform on the transformed input. Options are:
          `RELU`, `SOFTPLUS`, `SIGMOID` or `IDENTITY`. Defaults to `IDENTITY`.
code: def forward(
      self, features: torch.Tensor, z: Optional[torch.Tensor] = None
  ) -> torch.Tensor:
      transfomed_input = features * self.scale + self.shift
      if self.operation == DecoderActivation.SOFTPLUS:
          return torch.nn.functional.softplus(transfomed_input)
      if self.operation == DecoderActivation.RELU:
          return torch.nn.functional.relu(transfomed_input)
      if self.operation == DecoderActivation.SIGMOID:
          return torch.nn.functional.sigmoid(transfomed_input)
      return transfomed_input
  
imports: import logging
  from dataclasses import field
  from enum import Enum
  from typing import Dict, Optional, Tuple
  import torch
  from omegaconf import DictConfig
  from pytorch3d.implicitron.tools.config import Configurable, registry, ReplaceableBase, run_auto_creation
label_desc: Use image node_id 2 for calling the ElementwiseDecoder obj's underlying member method code with example usage: obj.forward(features, z) and returns: transfomed_input, torch, torch, torch