code: def __init__(
      self,
      channels: List[int],
      norm: Optional[str] = None,
      bias: bool = True,
      dropout: float = 0.0,
  ):
      m = []
      for i in range(1, len(channels)):
          m.append(Linear(channels[i - 1], channels[i], bias=bias))
  
          if i < len(channels) - 1:
              if norm and norm == "batch":
                  m.append(BatchNorm1d(channels[i], affine=True))
              elif norm and norm == "layer":
                  m.append(
                      LayerNorm(channels[i], elementwise_affine=True)
                  )
              elif norm and norm == "instance":
                  m.append(InstanceNorm1d(channels[i], affine=False))
              elif norm:
                  raise NotImplementedError(
                      f'Normalization layer "{norm}" not supported.'
                  )
              m.append(ReLU())
              m.append(Dropout(dropout))
  
      super().__init__(*m)
  
file_path: pytorch_geometric/torch_geometric/nn/conv/gen_conv.py
imports: from typing import List, Optional, Tuple, Union
  from torch import Tensor
  from torch.nn import BatchNorm1d, Dropout, InstanceNorm1d, LayerNorm, ReLU, Sequential
  from torch_geometric.nn.aggr import Aggregation, MultiAggregation
  from torch_geometric.nn.conv import MessagePassing
  from torch_geometric.nn.dense.linear import Linear
  from torch_geometric.nn.inits import reset
  from torch_geometric.nn.norm import MessageNorm
  from torch_geometric.typing import Adj, OptPairTensor, OptTensor, Size, SparseTensor
  from torch_geometric.utils import is_torch_sparse_tensor, to_edge_index
label_desc: Use image node_id 1 to create a new MLP object from inherited base classes: Sequential with example: obj = MLP(channels, norm, bias, dropout)