class_docstr: operations performed:
    1x1 x depth
    3x3 x depth dilation 6
    3x3 x depth dilation 12
    3x3 x depth dilation 18
    image pooling
    concatenate all together
    Final 1x1 conv
code: def __init__(
      self, in_dim, reduction_dim=256, output_stride=16, rates=None
  ):
      if rates is None:
          rates = [6, 12, 18]
      super(_AtrousSpatialPyramidPoolingModule, self).__init__()
  
      # Check if we are using distributed BN and use the nn from encoding.nn
      # library rather than using standard pytorch.nn
  
      if output_stride == 8:
          rates = [2 * r for r in rates]
      elif output_stride == 16:
          pass
      else:
          raise "output stride of {} not supported".format(
              output_stride
          )
  
      self.features = []
      # 1x1
      self.features.append(
          nn.Sequential(
              nn.Conv2d(
                  in_dim, reduction_dim, kernel_size=1, bias=False
              ),
              Norm2d(reduction_dim),
              nn.ReLU(inplace=True),
          )
      )
      # other rates
      for r in rates:
          self.features.append(
              nn.Sequential(
                  nn.Conv2d(
                      in_dim,
                      reduction_dim,
                      kernel_size=3,
                      dilation=r,
                      padding=r,
                      bias=False,
                  ),
                  Norm2d(reduction_dim),
                  nn.ReLU(inplace=True),
              )
          )
      self.features = torch.nn.ModuleList(self.features)
  
      # img level features
      self.img_pooling = nn.AdaptiveAvgPool2d(1)
      self.img_conv = nn.Sequential(
          nn.Conv2d(in_dim, reduction_dim, kernel_size=1, bias=False),
          Norm2d(reduction_dim),
          nn.ReLU(inplace=True),
      )
      self.edge_conv = nn.Sequential(
          nn.Conv2d(1, reduction_dim, kernel_size=1, bias=False),
          Norm2d(reduction_dim),
          nn.ReLU(inplace=True),
      )
  
imports: import torch
  import torch.nn.functional
  from torch import nn
  from .None import Resnet
  from .wider_resnet import wider_resnet38_a2
  from .mynn import initialize_weights, Norm2d
  from torch.autograd import Variable
  from .my_functionals import GatedSpatialConv
  import cv2
  import numpy
label_desc: Use image node_id 1 to create a new _AtrousSpatialPyramidPoolingModule object from inherited base classes: nn with example: obj = _AtrousSpatialPyramidPoolingModule(in_dim, reduction_dim, output_stride, rates)