class_docstr: Dilated depth separable convolutional based spline flow.
  
  Args:
      in_channels (int): Number of input tensor channels.
      hidden_channels (int): Number of in network channels.
      kernel_size (int): Convolutional kernel size.
      num_layers (int): Number of convolutional layers.
      num_bins (int, optional): Number of spline bins. Defaults to 10.
      tail_bound (float, optional): Tail bound for PRQT. Defaults to 5.0.
code: def __init__(
      self,
      in_channels: int,
      hidden_channels: int,
      kernel_size: int,
      num_layers: int,
      num_bins=10,
      tail_bound=5.0,
  ):
      super().__init__()
      self.num_bins = num_bins
      self.tail_bound = tail_bound
      self.hidden_channels = hidden_channels
      self.half_channels = in_channels // 2
  
      self.pre = nn.Conv1d(self.half_channels, hidden_channels, 1)
      self.convs = DilatedDepthSeparableConv(
          hidden_channels, kernel_size, num_layers, dropout_p=0.0
      )
      self.proj = nn.Conv1d(
          hidden_channels, self.half_channels * (num_bins * 3 - 1), 1
      )
      self.proj.weight.data.zero_()
      self.proj.bias.data.zero_()
  
imports: import math
  import torch
  from torch import nn
  from torch.nn import functional
  from TTS.tts.layers.generic.normalization import LayerNorm2
  from TTS.tts.layers.vits.transforms import piecewise_rational_quadratic_transform
label_desc: Use image node_id 1 to create a new ConvFlow object from inherited base classes: nn with example: obj = ConvFlow(in_channels, hidden_channels, kernel_size, num_layers, num_bins, tail_bound)