docstr: Args:
      tokens: (B, N, C) where N is length, B is batch size and C is classes number
      lengths: (B,)
docstr_tok: ["Args",":","tokens",":","(","B",",","N",",","C",")","where","N","is","length",",","B","is","batch","size","and","C","is","classes","number","lengths",":","(","B",",",")"]
code: def forward(self, tokens, lengths):
      """
      Args:
          tokens: (B, N, C) where N is length, B is batch size and C is classes number
          lengths: (B,)
      """
      if self.detach:
          tokens = tokens.detach()
      embed = self.proj(tokens)  # (B, N, C)
      embed = self.token_encoder(embed)  # (B, N, C)
      padding_mask = _get_mask(lengths, self.max_length)
      zeros = paddle.zeros_like(embed)  # (B, N, C)
      qeury = self.pos_encoder(zeros)
      for decoder_layer in self.decoder:
          qeury = decoder_layer(qeury, embed, cross_mask=padding_mask)
      output = qeury  # (B, N, C)
  
      logits = self.cls(output)  # (B, N, C)
  
      return output, logits
  
imports: import math
  import paddle
  from paddle import nn
  import paddle.nn.functional
  from paddle.nn import LayerList
  from ppocr.modeling.heads.rec_nrtr_head import TransformerBlock, PositionalEncoding
label_desc: Use image node_id 2 for calling the BCNLanguage obj's underlying member method code with example usage: obj.forward(tokens, lengths) and returns: output,  logits