class_docstr: VGG motibated cnn layers.
  
  Args:
      in_channel (int): Number of channels.
docstr: VGG2L forward propagation.
  
  Args:
      xs (chainer.Variable): Batch of padded character ids. (B, Tmax)
      ilens (chainer.Variable): Batch of length of each features. (B,)
  
  Returns:
      chainer.Variable: Subsampled vector of xs.
      chainer.Variable: Subsampled vector of ilens.
docstr_tok: ["VGG2L","forward","propagation",".","Args",":","xs","(","chainer.Variable",")",":","Batch","of","padded","character","ids",".","(","B",",","Tmax",")","ilens","(","chainer.Variable",")",":","Batch","of","length","of","each","features",".","(","B",",",")","Returns",":","chainer.Variable",":","Subsampled","vector","of","xs",".","chainer.Variable",":","Subsampled","vector","of","ilens","."]
code: def __call__(self, xs, ilens):
      """VGG2L forward propagation.
  
      Args:
          xs (chainer.Variable): Batch of padded character ids. (B, Tmax)
          ilens (chainer.Variable): Batch of length of each features. (B,)
  
      Returns:
          chainer.Variable: Subsampled vector of xs.
          chainer.Variable: Subsampled vector of ilens.
  
      """
      logging.info(
          self.__class__.__name__ + " input lengths: " + str(ilens)
      )
  
      # x: utt x frame x dim
      xs = F.pad_sequence(xs)
  
      # x: utt x 1 (input channel num) x frame x dim
      xs = F.swapaxes(
          xs.reshape(
              xs.shape[0],
              xs.shape[1],
              self.in_channel,
              xs.shape[2] // self.in_channel,
          ),
          1,
          2,
      )
  
      xs = F.relu(self.conv1_1(xs))
      xs = F.relu(self.conv1_2(xs))
      xs = F.max_pooling_2d(xs, 2, stride=2)
  
      xs = F.relu(self.conv2_1(xs))
      xs = F.relu(self.conv2_2(xs))
      xs = F.max_pooling_2d(xs, 2, stride=2)
  
      # change ilens accordingly
      ilens = self.xp.array(
          self.xp.ceil(self.xp.array(ilens, dtype=np.float32) / 2),
          dtype=np.int32,
      )
      ilens = self.xp.array(
          self.xp.ceil(self.xp.array(ilens, dtype=np.float32) / 2),
          dtype=np.int32,
      )
  
      # x: utt_list of frame (remove zeropaded frames) x (input channel num x dim)
      xs = F.swapaxes(xs, 1, 2)
      xs = xs.reshape(
          xs.shape[0], xs.shape[1], xs.shape[2] * xs.shape[3]
      )
      xs = [xs[i, : ilens[i], :] for i in range(len(ilens))]
  
      return xs, ilens
  
imports: import logging
  import chainer
  import chainer.functions
  import chainer.links
  import numpy
  from chainer import cuda
  from espnet.nets.chainer_backend.nets_utils import _subsamplex
  from espnet.nets.e2e_asr_common import get_vgg2l_odim
label_desc: Use image node_id 2 for calling the VGG2L obj's underlying member method code with example usage: obj.__call__(xs, ilens) and returns: xs,  ilens