class_docstr: MLP network architecture
  
  :meta private:
code: def __init__(
      self,
      dim_inp=None,
      dim_out=None,
      nhiddens=(400, 400, 400),
      bn=True,
  ):
      super().__init__()
      self.dim_inp = dim_inp
      self.layers = nn.ModuleList([])
      for i in range(len(nhiddens)):
          if i == 0:
              layer = nn.Linear(dim_inp, nhiddens[i], bias=False)
          else:
              layer = nn.Linear(
                  nhiddens[i - 1], nhiddens[i], bias=False
              )
          self.layers.append(layer)
          bn_layer = (
              nn.BatchNorm1d(nhiddens[i]) if bn else nn.Sequential()
          )
          relu_layer = nn.ReLU(inplace=True)
          self.layers.extend([bn_layer, relu_layer])
  
      fc = nn.Linear(nhiddens[-1], dim_out, bias=True)
      self.layers.append(fc)
      self.net = nn.Sequential(*self.layers)
  
      self.nhiddens = nhiddens
  
      param_init(self)
  
imports: import logging
  import math
  import numpy
  import pandas
  from merlion.models.anomaly.base import DetectorConfig, DetectorBase
  from merlion.post_process.threshold import AdaptiveAggregateAlarms
  from merlion.transform.moving_average import DifferenceTransform
  from merlion.utils import UnivariateTimeSeries, TimeSeries, to_timestamp
label_desc: Use image node_id 1 to create a new MLPNet object from inherited base classes: nn with example: obj = MLPNet(dim_inp, dim_out, nhiddens, bn)