class_docstr: Implement Shallow CNN block for SATRN.
  
  SATRN: `On Recognizing Texts of Arbitrary Shapes with 2D Self-Attention
  <https://arxiv.org/pdf/1910.04396.pdf>`_.
  
  Args:
      input_channels (int): Number of channels of input image tensor
          :math:`D_i`. Defaults to 1.
      hidden_dim (int): Size of hidden layers of the model :math:`D_m`.
          Defaults to 512.
      init_cfg (dict or list[dict], optional): Initialization configs.
docstr: Args:
      x (Tensor): Input image feature :math:`(N, D_i, H, W)`.
  
  Returns:
      Tensor: A tensor of shape :math:`(N, D_m, H/4, W/4)`.
docstr_tok: ["Args",":","x","(","Tensor",")",":","Input","image","feature",":","math",":","`","(","N",",","D_i",",","H",",","W",")","`",".","Returns",":","Tensor",":","A","tensor","of","shape",":","math",":","`","(","N",",","D_m",",","H\/4",",","W\/4",")","`","."]
code: def forward(self, x: Tensor) -> Tensor:
      """
      Args:
          x (Tensor): Input image feature :math:`(N, D_i, H, W)`.
  
      Returns:
          Tensor: A tensor of shape :math:`(N, D_m, H/4, W/4)`.
      """
  
      x = self.conv1(x)
      x = self.pool(x)
  
      x = self.conv2(x)
      x = self.pool(x)
  
      return x
  
file_path: mmocr/mmocr/models/textrecog/backbones/shallow_cnn.py
imports: from typing import Dict, List, Optional, Union
  import torch.nn
  from mmcv.cnn import ConvModule
  from mmengine.model import BaseModule
  from torch import Tensor
  from mmocr.registry import MODELS
label_desc: Use image node_id 2 for calling the ShallowCNN obj's underlying member method code with example usage: obj.forward(x) and returns: x