class_docstr: A Convolutional encoder suited for MNIST and Variational Autoencoder-based
  models.
  
  
  It can be built as follows:
  
  .. code-block::
  
          >>> from pythae.models.nn.benchmarks.mnist import Encoder_Conv_VAE_MNIST
          >>> from pythae.models import VAEConfig
          >>> model_config = VAEConfig(input_dim=(1, 28, 28), latent_dim=16)
          >>> encoder = Encoder_Conv_VAE_MNIST(model_config)
          >>> encoder
          ... Encoder_Conv_VAE_MNIST(
          ...   (layers): ModuleList(
          ...     (0): Sequential(
          ...       (0): Conv2d(1, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))
          ...       (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          ...       (2): ReLU()
          ...     )
          ...     (1): Sequential(
          ...       (0): Conv2d(128, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))
          ...       (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          ...       (2): ReLU()
          ...     )
          ...     (2): Sequential(
          ...       (0): Conv2d(256, 512, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))
          ...       (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          ...       (2): ReLU()
          ...     )
          ...     (3): Sequential(
          ...       (0): Conv2d(512, 1024, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))
          ...       (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          ...       (2): ReLU()
          ...     )
          ...   )
          ...   (embedding): Linear(in_features=1024, out_features=16, bias=True)
          ...   (log_var): Linear(in_features=1024, out_features=16, bias=True)
          ... )
  
  and then passed to a :class:`pythae.models` instance
  
      >>> from pythae.models import VAE
      >>> model = VAE(model_config=model_config, encoder=encoder)
      >>> model.encoder == encoder
      ... True
  
  .. note::
  
      Please note that this encoder is only suitable for Variational Autoencoder based models
      since it outputs the embeddings and the **log** of the covariance diagonal coefficients
      of the input data under the key `embedding` and `log_covariance`.
  
      .. code-block::
  
          >>> import torch
          >>> input = torch.rand(2, 1, 28, 28)
          >>> out = encoder(input)
          >>> out.embedding.shape
          ... torch.Size([2, 16])
          >>> out.log_covariance.shape
          ... torch.Size([2, 16])
class_docstr_tok: ["A","Convolutional","encoder","suited","for","MNIST","and","Variational","Autoencoder-based","models",".","It","can","be","built","as","follows",":","..","code-block",":",":",">",">",">","from","pythae.models.nn.benchmarks.mnist","import","Encoder_Conv_VAE_MNIST",">",">",">","from","pythae.models","import","VAEConfig",">",">",">","model_config","=","VAEConfig","(","input_dim=","(","1",",","28",",","28",")",",","latent_dim=16",")",">",">",">","encoder","=","Encoder_Conv_VAE_MNIST","(","model_config",")",">",">",">","encoder","...","Encoder_Conv_VAE_MNIST","(","...","(","layers",")",":","ModuleList","(","...","(","0",")",":","Sequential","(","...","(","0",")",":","Conv2d","(","1",",","128",",","kernel_size=","(","4",",","4",")",",","stride=","(","2",",","2",")",",","padding=","(","1",",","1",")",")","...","(","1",")",":","BatchNorm2d","(","128",",","eps=1e-05",",","momentum=0.1",",","affine=True",",","track_running_stats=True",")","...","(","2",")",":","ReLU","(",")","...",")","...","(","1",")",":","Sequential","(","...","(","0",")",":","Conv2d","(","128",",","256",",","kernel_size=","(","4",",","4",")",",","stride=","(","2",",","2",")",",","padding=","(","1",",","1",")",")","...","(","1",")",":","BatchNorm2d","(","256",",","eps=1e-05",",","momentum=0.1",",","affine=True",",","track_running_stats=True",")","...","(","2",")",":","ReLU","(",")","...",")","...","(","2",")",":","Sequential","(","...","(","0",")",":","Conv2d","(","256",",","512",",","kernel_size=","(","4",",","4",")",",","stride=","(","2",",","2",")",",","padding=","(","1",",","1",")",")","...","(","1",")",":","BatchNorm2d","(","512",",","eps=1e-05",",","momentum=0.1",",","affine=True",",","track_running_stats=True",")","...","(","2",")",":","ReLU","(",")","...",")","...","(","3",")",":","Sequential","(","...","(","0",")",":","Conv2d","(","512",",","1024",",","kernel_size=","(","4",",","4",")",",","stride=","(","2",",","2",")",",","padding=","(","1",",","1",")",")","...","(","1",")",":","BatchNorm2d","(","1024",",","eps=1e-05",",","momentum=0.1",",","affine=True",",","track_running_stats=True",")","...","(","2",")",":","ReLU","(",")","...",")","...",")","...","(","embedding",")",":","Linear","(","in_features=1024",",","out_features=16",",","bias=True",")","...","(","log_var",")",":","Linear","(","in_features=1024",",","out_features=16",",","bias=True",")","...",")","and","then","passed","to","a",":","class",":","`","pythae.models","`","instance",">",">",">","from","pythae.models","import","VAE",">",">",">","model","=","VAE","(","model_config=model_config",",","encoder=encoder",")",">",">",">","model.encoder","==","encoder","...","True","..","note",":",":","Please","note","that","this","encoder","is","only","suitable","for","Variational","Autoencoder","based","models","since","it","outputs","the","embeddings","and","the","*","*","log","*","*","of","the","covariance","diagonal","coefficients","of","the","input","data","under","the","key","`","embedding","`","and","`","log_covariance","`",".","..","code-block",":",":",">",">",">","import","torch",">",">",">","input","=","torch.rand","(","2",",","1",",","28",",","28",")",">",">",">","out","=","encoder","(","input",")",">",">",">","out.embedding.shape","...","torch.Size","(","[","2",",","16","]",")",">",">",">","out.log_covariance.shape","...","torch.Size","(","[","2",",","16","]",")"]
docstr: Forward method
  
  Args:
      output_layer_levels (List[int]): The levels of the layers where the outputs are
          extracted. If None, the last layer's output is returned. Default: None.
  
  Returns:
      ModelOutput: An instance of ModelOutput containing the embeddings of the input data
      under the key `embedding` and the **log** of the diagonal coefficient of the covariance
      matrices under the key `log_covariance`. Optional: The outputs of the layers specified
      in `output_layer_levels` arguments are available under the keys `embedding_layer_i`
      where i is the layer's level.
docstr_tok: ["Forward","method","Args",":","output_layer_levels","(","List","[","int","]",")",":","The","levels","of","the","layers","where","the","outputs","are","extracted",".","If","None",",","the","last","layer","'s","output","is","returned",".","Default",":","None",".","Returns",":","ModelOutput",":","An","instance","of","ModelOutput","containing","the","embeddings","of","the","input","data","under","the","key","`","embedding","`","and","the","*","*","log","*","*","of","the","diagonal","coefficient","of","the","covariance","matrices","under","the","key","`","log_covariance","`",".","Optional",":","The","outputs","of","the","layers","specified","in","`","output_layer_levels","`","arguments","are","available","under","the","keys","`","embedding_layer_i","`","where","i","is","the","layer","'s","level","."]
code: def forward(
      self, x: torch.Tensor, output_layer_levels: List[int] = None
  ):
      """Forward method
  
      Args:
          output_layer_levels (List[int]): The levels of the layers where the outputs are
              extracted. If None, the last layer's output is returned. Default: None.
  
      Returns:
          ModelOutput: An instance of ModelOutput containing the embeddings of the input data
          under the key `embedding` and the **log** of the diagonal coefficient of the covariance
          matrices under the key `log_covariance`. Optional: The outputs of the layers specified
          in `output_layer_levels` arguments are available under the keys `embedding_layer_i`
          where i is the layer's level."""
      output = ModelOutput()
  
      max_depth = self.depth
  
      if output_layer_levels is not None:
          assert all(
              self.depth >= levels > 0 or levels == -1
              for levels in output_layer_levels
          ), (
              f"Cannot output layer deeper than depth ({self.depth})."
              f"Got ({output_layer_levels})"
          )
  
          if -1 in output_layer_levels:
              max_depth = self.depth
          else:
              max_depth = max(output_layer_levels)
  
      out = x
  
      for i in range(max_depth):
          out = self.layers[i](out)
  
          if output_layer_levels is not None:
              if i + 1 in output_layer_levels:
                  output[f"embedding_layer_{i+1}"] = out
  
          if i + 1 == self.depth:
              output["embedding"] = self.embedding(
                  out.reshape(x.shape[0], -1)
              )
              output["log_covariance"] = self.log_var(
                  out.reshape(x.shape[0], -1)
              )
  
      return output
  
imports: from typing import List
  import torch
  import torch.nn
  from pythae.models.nn import BaseDecoder, BaseDiscriminator, BaseEncoder
  from ....base import BaseAEConfig
  from ....base.base_utils import ModelOutput
  from ...base_architectures import BaseDecoder, BaseEncoder
label_desc: Use image node_id 2 for calling the Encoder_Conv_VAE_MNIST obj's underlying member method code with example usage: obj.forward(x, output_layer_levels) and returns: output