class_docstr: Convolutional subsampling which supports VGGNet and striding approach introduced in:
  VGGNet Subsampling: Transformer-transducer: end-to-end speech recognition with self-attention (https://arxiv.org/pdf/1910.12977.pdf)
  Striding Subsampling: "Speech-Transformer: A No-Recurrence Sequence-to-Sequence Model for Speech Recognition" by Linhao Dong et al. (https://ieeexplore.ieee.org/document/8462506)
  Args:
      subsampling (str): The subsampling technique from {"vggnet", "striding", "dw-striding"}
      subsampling_factor (int): The subsampling factor which should be a power of 2
      subsampling_conv_chunking_factor (int): Input chunking factor which can be -1 (no chunking) 
      1 (auto) or a power of 2. Default is 1
      feat_in (int): size of the input features
      feat_out (int): size of the output features
      conv_channels (int): Number of channels for the convolution layers.
      activation (Module): activation function, default is nn.ReLU()
class_docstr_tok: ["Convolutional","subsampling","which","supports","VGGNet","and","striding","approach","introduced","in",":","VGGNet","Subsampling",":","Transformer-transducer",":","end-to-end","speech","recognition","with","self-attention","(","https",":","\/\/arxiv.org\/pdf\/1910.12977.pdf",")","Striding","Subsampling",":","``","Speech-Transformer",":","A","No-Recurrence","Sequence-to-Sequence","Model","for","Speech","Recognition","''","by","Linhao","Dong","et","al",".","(","https",":","\/\/ieeexplore.ieee.org\/document\/8462506",")","Args",":","subsampling","(","str",")",":","The","subsampling","technique","from","{","``","vggnet","''",",","``","striding","''",",","``","dw-striding","''","}","subsampling_factor","(","int",")",":","The","subsampling","factor","which","should","be","a","power","of","2","subsampling_conv_chunking_factor","(","int",")",":","Input","chunking","factor","which","can","be","-1","(","no","chunking",")","1","(","auto",")","or","a","power","of","2",".","Default","is","1","feat_in","(","int",")",":","size","of","the","input","features","feat_out","(","int",")",":","size","of","the","output","features","conv_channels","(","int",")",":","Number","of","channels","for","the","convolution","layers",".","activation","(","Module",")",":","activation","function",",","default","is","nn.ReLU","(",")"]
docstr: For dw convs, tries to split input by time, run conv and concat results 
docstr_tok: ["For","dw","convs",",","tries","to","split","input","by","time",",","run","conv","and","concat","results"]
code: def conv_split_by_channel(self, x):
      """For dw convs, tries to split input by time, run conv and concat results"""
      x = self.conv[0](x)  # full conv2D
      x = self.conv[1](x)  # activation
  
      for i in range(self._sampling_num - 1):
          _, c, t, _ = x.size()
  
          if self.subsampling_conv_chunking_factor > 1:
              cf = self.subsampling_conv_chunking_factor
              logging.debug(f"using manually set chunking factor: {cf}")
          else:
              # avoiding a bug / feature limiting indexing of tensors to 2**31
              # see https://github.com/pytorch/pytorch/issues/80020
              p = math.ceil(math.log(torch.numel(x) / 2**31, 2))
              cf = 2**p
              logging.debug(f"using auto set chunking factor: {cf}")
  
          new_c = int(c // cf)
          if new_c == 0:
              logging.warning(
                  f"chunking factor {cf} is too high; splitting down to one channel."
              )
              new_c = 1
  
          new_t = int(t // cf)
          if new_t == 0:
              logging.warning(
                  f"chunking factor {cf} is too high; splitting down to one timestep."
              )
              new_t = 1
  
          logging.debug(
              f"conv dw subsampling: using split C size {new_c} and split T size {new_t}"
          )
          x = self.channel_chunked_conv(
              self.conv[i * 3 + 2], new_c, x
          )  # conv2D, depthwise
  
          # splitting pointwise convs by time
          x = torch.cat(
              [
                  self.conv[i * 3 + 3](chunk)
                  for chunk in torch.split(x, new_t, 2)
              ],
              2,
          )  # conv2D, pointwise
          x = self.conv[i * 3 + 4](x)  # activation
      return x
  
imports: import math
  import torch
  import torch.nn
  from torch.nn import LayerNorm
  from nemo.collections.asr.parts.submodules.causal_convs import CausalConv1D, CausalConv2D
  from nemo.utils import logging
label_desc: Use image node_id 7 for calling the ConvSubsampling obj's underlying member method code with example usage: obj.conv_split_by_channel(x) and returns: x