class_docstr: Computes a linear transformation y = wx + b.
  
  Arguments
  ---------
  n_neurons : int
      It is the number of output neurons (i.e, the dimensionality of the
      output).
  input_shape: tuple
      It is the shape of the input tensor.
  input_size: int
      Size of the input tensor.
  bias : bool
      If True, the additive bias b is adopted.
  combine_dims : bool
      If True and the input is 4D, combine 3rd and 4th dimensions of input.
  max_norm: float
      weight max-norm.
  Example
  -------
  >>> inputs = torch.rand(10, 50, 40)
  >>> lin_t = Linear(input_shape=(10, 50, 40), n_neurons=100)
  >>> output = lin_t(inputs)
  >>> output.shape
  torch.Size([10, 50, 100])
docstr: Returns the linear transformation of input tensor.
  
  Arguments
  ---------
  x : torch.Tensor
      Input to transform linearly.
docstr_tok: ["Returns","the","linear","transformation","of","input","tensor",".","Arguments","--","--","--","--","-","x",":","torch.Tensor","Input","to","transform","linearly","."]
code: def forward(self, x):
      """Returns the linear transformation of input tensor.
  
      Arguments
      ---------
      x : torch.Tensor
          Input to transform linearly.
      """
      if x.ndim == 4 and self.combine_dims:
          x = x.reshape(x.shape[0], x.shape[1], x.shape[2] * x.shape[3])
  
      if self.max_norm is not None:
          self.w.weight.data = torch.renorm(
              self.w.weight.data, p=2, dim=0, maxnorm=self.max_norm
          )
  
      wx = self.w(x)
  
      return wx
  
imports: import torch
  import logging
  import torch.nn
label_desc: Use image node_id 2 for calling the Linear obj's underlying member method code with example usage: obj.forward(x) and returns: wx