class_docstr: ### Two $3  imes 3$ Convolution Layers
  
  Each step in the contraction path and expansive path have two $3    imes 3$
  convolutional layers followed by ReLU activations.
  
  In the U-Net paper they used $0$ padding,
  but we use $1$ padding so that final feature map is not cropped.
class_docstr_tok: ["#","#","#","Two","$","3","imes","3","$","Convolution","Layers","Each","step","in","the","contraction","path","and","expansive","path","have","two","$","3","imes","3","$","convolutional","layers","followed","by","ReLU","activations",".","In","the","U-Net","paper","they","used","$","0","$","padding",",","but","we","use","$","1","$","padding","so","that","final","feature","map","is","not","cropped","."]
docstr: :param in_channels: is the number of input channels
  :param out_channels: is the number of output channels
docstr_tok: [":","param","in_channels",":","is","the","number","of","input","channels",":","param","out_channels",":","is","the","number","of","output","channels"]
code: def __init__(self, in_channels: int, out_channels: int):
      """
      :param in_channels: is the number of input channels
      :param out_channels: is the number of output channels
      """
      super().__init__()
  
      # First $3 \times 3$ convolutional layer
      self.first = nn.Conv2d(
          in_channels, out_channels, kernel_size=3, padding=1
      )
      self.act1 = nn.ReLU()
      # Second $3 \times 3$ convolutional layer
      self.second = nn.Conv2d(
          out_channels, out_channels, kernel_size=3, padding=1
      )
      self.act2 = nn.ReLU()
  
imports: import torch
  import torchvision.transforms.functional
  from torch import nn
label_desc: Use image node_id 1 to create a new DoubleConvolution object from inherited base classes: nn with example: obj = DoubleConvolution(in_channels, out_channels)