class_docstr: A kxk depthwise convolution + a 1x1 convolution.
  
  In :paper:`xception`, norm & activation are applied on the second conv.
  :paper:`mobilenet` uses norm & activation on both convs.
docstr: Args:
      norm1, norm2 (str or callable): normalization for the two conv layers.
      activation1, activation2 (callable(Tensor) -> Tensor): activation
          function for the two conv layers.
code: def __init__(
      self,
      in_channels,
      out_channels,
      kernel_size=3,
      padding=1,
      dilation=1,
      *,
      norm1=None,
      activation1=None,
      norm2=None,
      activation2=None,
  ):
      """
      Args:
          norm1, norm2 (str or callable): normalization for the two conv layers.
          activation1, activation2 (callable(Tensor) -> Tensor): activation
              function for the two conv layers.
      """
      super().__init__()
      self.depthwise = Conv2d(
          in_channels,
          in_channels,
          kernel_size=kernel_size,
          padding=padding,
          dilation=dilation,
          groups=in_channels,
          bias=not norm1,
          norm=get_norm(norm1, in_channels),
          activation=activation1,
      )
      self.pointwise = Conv2d(
          in_channels,
          out_channels,
          kernel_size=1,
          bias=not norm2,
          norm=get_norm(norm2, out_channels),
          activation=activation2,
      )
  
      # default initialization
      weight_init.c2_msra_fill(self.depthwise)
      weight_init.c2_msra_fill(self.pointwise)
  
file_path: detectron2/detectron2/layers/blocks.py
imports: import fvcore.nn.weight_init
  from torch import nn
  from .batch_norm import FrozenBatchNorm2d, get_norm
  from .wrappers import Conv2d
label_desc: Use image node_id 1 to create a new DepthwiseSeparableConv2d object from inherited base classes: nn with example: obj = DepthwiseSeparableConv2d(in_channels, out_channels, kernel_size, padding, dilation)