class_docstr: VGG-like module.
  
  Args:
      in_channel: number of input channels
class_docstr_tok: ["VGG-like","module",".","Args",":","in_channel",":","number","of","input","channels"]
docstr: VGG2L forward.
  
  Args:
      feats: Feature sequences. (B, F, D_feats)
      feats_len: Feature sequences lengths. (B, )
  
  Returns:
      vgg_out: VGG2L output sequences. (B, F // 4, 128 * D_feats // 4)
      vgg_out_len: VGG2L output sequences lengths. (B,)
docstr_tok: ["VGG2L","forward",".","Args",":","feats",":","Feature","sequences",".","(","B",",","F",",","D_feats",")","feats_len",":","Feature","sequences","lengths",".","(","B",",",")","Returns",":","vgg_out",":","VGG2L","output","sequences",".","(","B",",","F","\/\/","4",",","128","*","D_feats","\/\/","4",")","vgg_out_len",":","VGG2L","output","sequences","lengths",".","(","B",",",")"]
code: def forward(
      self, feats: torch.Tensor, feats_len: torch.Tensor, **kwargs
  ) -> Tuple[torch.Tensor, torch.Tensor, Optional[torch.Tensor]]:
      """VGG2L forward.
  
      Args:
          feats: Feature sequences. (B, F, D_feats)
          feats_len: Feature sequences lengths. (B, )
  
      Returns:
          vgg_out: VGG2L output sequences. (B, F // 4, 128 * D_feats // 4)
          vgg_out_len: VGG2L output sequences lengths. (B,)
  
      """
      feats = feats.view(
          feats.size(0),
          feats.size(1),
          self.in_channel,
          feats.size(2) // self.in_channel,
      ).transpose(1, 2)
  
      vgg1 = F.relu(self.conv1_1(feats))
      vgg1 = F.relu(self.conv1_2(vgg1))
      vgg1 = F.max_pool2d(vgg1, 2, stride=2, ceil_mode=True)
  
      vgg2 = F.relu(self.conv2_1(vgg1))
      vgg2 = F.relu(self.conv2_2(vgg2))
      vgg2 = F.max_pool2d(vgg2, 2, stride=2, ceil_mode=True)
  
      vgg_out = vgg2.transpose(1, 2)
      vgg_out = vgg_out.contiguous().view(
          vgg_out.size(0),
          vgg_out.size(1),
          vgg_out.size(2) * vgg_out.size(3),
      )
  
      if torch.is_tensor(feats_len):
          feats_len = feats_len.cpu().numpy()
      else:
          feats_len = np.array(feats_len, dtype=np.float32)
  
      vgg1_len = np.array(np.ceil(feats_len / 2), dtype=np.int64)
      vgg_out_len = np.array(
          np.ceil(np.array(vgg1_len, dtype=np.float32) / 2),
          dtype=np.int64,
      ).tolist()
  
      return vgg_out, vgg_out_len, None
  
imports: from argparse import Namespace
  from typing import List, Optional, Tuple, Union
  import numpy
  import torch
  import torch.nn.functional
  from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence
  from espnet.nets.e2e_asr_common import get_vgg2l_odim
  from espnet.nets.pytorch_backend.nets_utils import make_pad_mask, to_device
label_desc: Use image node_id 2 for calling the VGG2L obj's underlying member method code with example usage: obj.forward(feats, feats_len) and returns: vgg_out,  vgg_out_len,  None