class_docstr: The initial block is composed of two branches:
  1. a main branch which performs a regular convolution with stride 2;
  2. an extension branch which performs max-pooling.
  
  Doing both operations in parallel and concatenating their results
  allows for efficient downsampling and expansion. The main branch
  outputs 13 feature maps while the extension branch outputs 3, for a
  total of 16 feature maps after concatenation.
  
  Keyword arguments:
  - in_channels (int): the number of input channels.
  - out_channels (int): the number output channels.
  - kernel_size (int, optional): the kernel size of the filters used in
  the convolution layer. Default: 3.
  - padding (int, optional): zero-padding added to both sides of the
  input. Default: 0.
  - bias (bool, optional): Adds a learnable bias to the output if
  ``True``. Default: False.
  - relu (bool, optional): When ``True`` ReLU is used as the activation
  function; otherwise, PReLU is used. Default: True.
class_docstr_tok: ["The","initial","block","is","composed","of","two","branches",":","1.","a","main","branch","which","performs","a","regular","convolution","with","stride","2",";","2.","an","extension","branch","which","performs","max-pooling",".","Doing","both","operations","in","parallel","and","concatenating","their","results","allows","for","efficient","downsampling","and","expansion",".","The","main","branch","outputs","13","feature","maps","while","the","extension","branch","outputs","3",",","for","a","total","of","16","feature","maps","after","concatenation",".","Keyword","arguments",":","-","in_channels","(","int",")",":","the","number","of","input","channels",".","-","out_channels","(","int",")",":","the","number","output","channels",".","-","kernel_size","(","int",",","optional",")",":","the","kernel","size","of","the","filters","used","in","the","convolution","layer",".","Default",":","3",".","-","padding","(","int",",","optional",")",":","zero-padding","added","to","both","sides","of","the","input",".","Default",":","0",".","-","bias","(","bool",",","optional",")",":","Adds","a","learnable","bias","to","the","output","if","``","True","``",".","Default",":","False",".","-","relu","(","bool",",","optional",")",":","When","``","True","``","ReLU","is","used","as","the","activation","function",";","otherwise",",","PReLU","is","used",".","Default",":","True","."]
code: def __init__(
      self,
      in_channels,
      out_channels,
      kernel_size=3,
      padding=0,
      bias=False,
      relu=True,
  ):
      super().__init__()
  
      if relu:
          activation = nn.ReLU()
      else:
          activation = nn.PReLU()
  
      # Main branch - As stated above the number of output channels for this
      # branch is the total minus 3, since the remaining channels come from
      # the extension branch
      self.main_branch = nn.Conv2d(
          in_channels,
          out_channels - 3,
          kernel_size=kernel_size,
          stride=2,
          padding=padding,
          bias=bias,
      )
  
      # Extension branch
      self.ext_branch = nn.MaxPool2d(
          kernel_size, stride=2, padding=padding
      )
  
      # Initialize batch normalization to be used after concatenation
      self.batch_norm = nn.BatchNorm2d(out_channels)
  
      # PReLU layer to apply after concatenating the branches
      self.out_prelu = activation
  
imports: import torch.nn
  import torch
label_desc: Use image node_id 1 to create a new InitialBlock object from inherited base classes: nn with example: obj = InitialBlock(in_channels, out_channels, kernel_size, padding, bias, relu)