class_docstr: CBHG module: a recurrent neural network composed of:
  - 1-d convolution banks
  - Highway networks + residual connections
  - Bidirectional gated recurrent units
  
  Args:
      in_features (int): sample size
      K (int): max filter size in conv bank
      projections (list): conv channel sizes for conv projections
      num_highways (int): number of highways layers
  
  Shapes:
      - input: (B, C, T_in)
      - output: (B, T_in, C*2)
class_docstr_tok: ["CBHG","module",":","a","recurrent","neural","network","composed","of",":","-","1-d","convolution","banks","-","Highway","networks","+","residual","connections","-","Bidirectional","gated","recurrent","units","Args",":","in_features","(","int",")",":","sample","size","K","(","int",")",":","max","filter","size","in","conv","bank","projections","(","list",")",":","conv","channel","sizes","for","conv","projections","num_highways","(","int",")",":","number","of","highways","layers","Shapes",":","-","input",":","(","B",",","C",",","T_in",")","-","output",":","(","B",",","T_in",",","C","*","2",")"]
code: def forward(self, inputs):
      # (B, in_features, T_in)
      x = inputs
      # (B, hid_features*K, T_in)
      # Concat conv1d bank outputs
      outs = []
      for conv1d in self.conv1d_banks:
          out = conv1d(x)
          outs.append(out)
      x = torch.cat(outs, dim=1)
      assert x.size(1) == self.conv_bank_features * len(
          self.conv1d_banks
      )
      for conv1d in self.conv1d_projections:
          x = conv1d(x)
      x += inputs
      x = x.transpose(1, 2)
      if self.highway_features != self.conv_projections[-1]:
          x = self.pre_highway(x)
      # Residual connection
      # TODO: try residual scaling as in Deep Voice 3
      # TODO: try plain residual layers
      for highway in self.highways:
          x = highway(x)
      # (B, T_in, hid_features*2)
      # TODO: replace GRU with convolution as in Deep Voice 3
      self.gru.flatten_parameters()
      outputs, _ = self.gru(x)
      return outputs
  
imports: import torch
  from torch import nn
  from .common_layers import Prenet
  from .attentions import init_attn
label_desc: Use image node_id 2 for calling the CBHG obj's underlying member method code with example usage: obj.forward(inputs) and returns: outputs