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","."]
docstr: Forward function.
  
  Args:
      x (Tensor): Input tensor.
  
  Returns:
      Tensor: Output tensor.
docstr_tok: ["Forward","function",".","Args",":","x","(","Tensor",")",":","Input","tensor",".","Returns",":","Tensor",":","Output","tensor","."]
code: def forward(self, x: torch.Tensor) -> torch.Tensor:
      """Forward function.
  
      Args:
          x (Tensor): Input tensor.
  
      Returns:
          Tensor: Output tensor.
      """
      x = self.depthwise_conv(x)
      x = self.pointwise_conv(x)
      x = self.bn(x)
      x = self.relu(x)
      return x
  
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 2 for calling the SeparableConv2d obj's underlying member method code with example usage: obj.forward(x) and returns: x