docstr: Args:
      x (list[Tensor] | tuple[Tensor]): A list of four tensors of shape
          :math:`(N, C_i, H_i, W_i)`, representing C2, C3, C4, C5
          features respectively. :math:`C_i` should matches the number in
          ``in_channels``.
  
  Returns:
      Tensor: Shape :math:`(N, C, H, W)` where :math:`H=4H_0` and
      :math:`W=4W_0`.
docstr_tok: ["Args",":","x","(","list","[","Tensor","]","|","tuple","[","Tensor","]",")",":","A","list","of","four","tensors","of","shape",":","math",":","`","(","N",",","C_i",",","H_i",",","W_i",")","`",",","representing","C2",",","C3",",","C4",",","C5","features","respectively",".",":","math",":","`","C_i","`","should","matches","the","number","in","``","in_channels","``",".","Returns",":","Tensor",":","Shape",":","math",":","`","(","N",",","C",",","H",",","W",")","`","where",":","math",":","`","H=4H_0","`","and",":","math",":","`","W=4W_0","`","."]
code: def forward(self, x):
      """
      Args:
          x (list[Tensor] | tuple[Tensor]): A list of four tensors of shape
              :math:`(N, C_i, H_i, W_i)`, representing C2, C3, C4, C5
              features respectively. :math:`C_i` should matches the number in
              ``in_channels``.
  
      Returns:
          Tensor: Shape :math:`(N, C, H, W)` where :math:`H=4H_0` and
          :math:`W=4W_0`.
      """
      c2, c3, c4, c5 = x
  
      x = F.relu(self.up4(c5))
  
      x = paddle.concat([x, c4], axis=1)
      x = F.relu(self.up_block3(x))
  
      x = paddle.concat([x, c3], axis=1)
      x = F.relu(self.up_block2(x))
  
      x = paddle.concat([x, c2], axis=1)
      x = F.relu(self.up_block1(x))
  
      x = self.up_block0(x)
      return x
  
file_path: PaddleOCR/ppocr/modeling/necks/fpn_unet.py
imports: import paddle
  import paddle.nn
  import paddle.nn.functional
label_desc: Use image node_id 2 for calling the FPN_UNet obj's underlying member method code with example usage: obj.forward(x) and returns: x