class_docstr: ## Autoencoder
  
  This consists of the encoder and decoder modules.
docstr: :param encoder: is the encoder
  :param decoder: is the decoder
  :param emb_channels: is the number of dimensions in the quantized embedding space
  :param z_channels: is the number of channels in the embedding space
code: def __init__(
      self,
      encoder: "Encoder",
      decoder: "Decoder",
      emb_channels: int,
      z_channels: int,
  ):
      """
      :param encoder: is the encoder
      :param decoder: is the decoder
      :param emb_channels: is the number of dimensions in the quantized embedding space
      :param z_channels: is the number of channels in the embedding space
      """
      super().__init__()
      self.encoder = encoder
      self.decoder = decoder
      # Convolution to map from embedding space to
      # quantized embedding space moments (mean and log variance)
      self.quant_conv = nn.Conv2d(2 * z_channels, 2 * emb_channels, 1)
      # Convolution to map from quantized embedding space back to
      # embedding space
      self.post_quant_conv = nn.Conv2d(emb_channels, z_channels, 1)
  
imports: from typing import List
  import torch
  import torch.nn.functional
  from torch import nn
label_desc: Use image node_id 1 to create a new Autoencoder object from inherited base classes: nn with example: obj = Autoencoder(encoder, decoder, emb_channels, z_channels)