class_docstr: Convolution block, including squeeze-and-excitation.
  
  Arguments
  ---------
  input_shape : tuple of ints
      The expected size of the inputs.
  channels : int
      Number of output channels.
  activation : function
      Function applied before each block.
  normalization : class
      Name of a class to use for constructing norm layers.
  dropout : float
      Portion of block outputs to drop during training.
  
  Example
  -------
  >>> inputs = torch.rand([10, 20, 30, 128])
  >>> block = ConvBlock(input_shape=inputs.shape, channels=256)
  >>> outputs = block(inputs)
  >>> outputs.shape
  torch.Size([10, 20, 15, 256])
code: def __init__(
      self,
      input_shape,
      channels,
      activation=torch.nn.GELU(),
      normalization=sb.nnet.normalization.LayerNorm,
      dropout=0.1,
  ):
      super().__init__()
      self.activation = activation
      self.downsample = sb.nnet.CNN.Conv2d(
          input_shape=input_shape,
          out_channels=channels,
          kernel_size=3,
          stride=(2, 1),
      )
      self.conv1 = sb.nnet.CNN.Conv2d(
          in_channels=channels, out_channels=channels, kernel_size=3
      )
      self.norm1 = normalization(input_size=channels)
      self.conv2 = sb.nnet.CNN.Conv2d(
          in_channels=channels,
          out_channels=channels,
          kernel_size=3,
      )
      self.norm2 = normalization(input_size=channels)
      self.dropout = sb.nnet.dropout.Dropout2d(drop_rate=dropout)
  
      self.se_block = SEblock(input_size=channels)
  
file_path: speechbrain/speechbrain/lobes/models/EnhanceResnet.py
imports: import torch
  import speechbrain
  from speechbrain.processing.features import STFT, ISTFT, spectral_magnitude
label_desc: Use image node_id 1 to create a new ConvBlock object from inherited base classes: torch.nn with example: obj = ConvBlock(input_shape, channels, activation, normalization, dropout)