code: def __init__(
      self,
      num_chars: int,
      embedding_size: int,
      config: CnnConfig,
      dropout_rate: float = 0.0,
  ):
      super().__init__()
      self.__num_chars_in_vocabulary = num_chars
      self.__conv_l1 = nn.Conv1d(
          in_channels=num_chars,
          out_channels=config.l1_filters,
          kernel_size=config.l1_window_size,
      )
  
      self.__conv_l2 = nn.Conv1d(
          in_channels=config.l1_filters,
          out_channels=config.l2_filters,
          kernel_size=config.l2_window_size,
      )
  
      self.__conv_l3 = nn.Conv1d(
          in_channels=config.l2_filters,
          out_channels=embedding_size,
          kernel_size=config.lout_window_size,
          bias=False,
      )
      self.__dropout = nn.Dropout(p=dropout_rate)
  
imports: from typing_extensions import Final, Literal
  import logging
  import math
  import numpy
  import torch
  import torch.nn
  from dpu_utils.codeutils import split_identifier_into_parts
  from dpu_utils.mlutils import BpeVocabulary, CharTensorizer, Vocabulary
  from typing import Any, Counter, Dict, List, NamedTuple, Optional, Union
  from ptgnn.baseneuralmodel import AbstractNeuralModel
  from ptgnn.neuralmodels.gnn.structs import AbstractNodeEmbedder
label_desc: Use image node_id 1 to create a new CharUnitEmbedder object from inherited base classes: nn with example: obj = CharUnitEmbedder(num_chars, embedding_size, config, dropout_rate)