class_docstr: Implementation of separable convolution, which is consisted of depthwise
  convolution and pointwise convolution.
  
  Args:
      in_channels (int): Number of input channels.
      out_channels (int): Number of output channels.
      stride (int): Stride of the depthwise convolution.
      init_cfg (dict or list[dict], optional): Initialization configs.
class_docstr_tok: ["Implementation","of","separable","convolution",",","which","is","consisted","of","depthwise","convolution","and","pointwise","convolution",".","Args",":","in_channels","(","int",")",":","Number","of","input","channels",".","out_channels","(","int",")",":","Number","of","output","channels",".","stride","(","int",")",":","Stride","of","the","depthwise","convolution",".","init_cfg","(","dict","or","list","[","dict","]",",","optional",")",":","Initialization","configs","."]
code: def __init__(
      self,
      in_channels: int,
      out_channels: int,
      stride: int = 1,
      init_cfg: Optional[Union[Dict, List[Dict]]] = None,
  ) -> None:
      super().__init__(init_cfg=init_cfg)
  
      self.depthwise_conv = nn.Conv2d(
          in_channels=in_channels,
          out_channels=in_channels,
          kernel_size=3,
          padding=1,
          stride=stride,
          groups=in_channels,
      )
      self.pointwise_conv = nn.Conv2d(
          in_channels=in_channels,
          out_channels=out_channels,
          kernel_size=1,
      )
      self.bn = nn.BatchNorm2d(out_channels)
      self.relu = nn.ReLU()
  
file_path: mmocr/mmocr/models/textdet/necks/fpem_ffm.py
imports: from typing import Dict, List, Optional, Tuple, Union
  import torch
  import torch.nn.functional
  from mmengine.model import BaseModule, ModuleList
  from torch import nn
  from mmocr.registry import MODELS
label_desc: Use image node_id 1 to create a new SeparableConv2d object from inherited base classes: BaseModule with example: obj = SeparableConv2d(in_channels, out_channels, stride, init_cfg)