class_docstr: A ResNet encoder suited for CIFAR and Autoencoder-based models.
  
  It can be built as follows:
  
  .. code-block::
  
      >>> from pythae.models.nn.benchmarks.cifar import Encoder_ResNet_AE_CIFAR
      >>> from pythae.models import AEConfig
      >>> model_config = AEConfig(input_dim=(3, 32, 32), latent_dim=16)
      >>> encoder = Encoder_ResNet_AE_CIFAR(model_config)
      >>> encoder
      ... Encoder_ResNet_AE_CIFAR(
      ...   (layers): ModuleList(
      ...     (0): Sequential(
      ...       (0): Conv2d(3, 64, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))
      ...     )
      ...     (1): Sequential(
      ...       (0): Conv2d(64, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))
      ...     )
      ...     (2): Sequential(
      ...       (0): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      ...     )
      ...     (3): Sequential(
      ...       (0): ResBlock(
      ...         (conv_block): Sequential(
      ...           (0): ReLU()
      ...           (1): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      ...           (2): ReLU()
      ...           (3): Conv2d(32, 128, kernel_size=(1, 1), stride=(1, 1))
      ...         )
      ...       )
      ...       (1): ResBlock(
      ...         (conv_block): Sequential(
      ...           (0): ReLU()
      ...           (1): Conv2d(128, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
      ...           (2): ReLU()
      ...           (3): Conv2d(32, 128, kernel_size=(1, 1), stride=(1, 1))
      ...         )
      ...       )
      ...     )
      ...   )
      ...   (embedding): Linear(in_features=8192, out_features=16, bias=True)
      ... )
  
  
  and then passed to a :class:`pythae.models` instance
  
      >>> from pythae.models import AE
      >>> model = AE(model_config=model_config, encoder=encoder)
      >>> model.encoder == encoder
      ... True
  
  .. note::
  
      Please note that this encoder is only suitable for Autoencoder based models since it only
      outputs the embeddings of the input data under the key `embedding`.
  
      .. code-block::
  
          >>> import torch
          >>> input = torch.rand(2, 3, 32, 32)
          >>> out = encoder(input)
          >>> out.embedding.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`. 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","`",".","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`. 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)
              )
  
      return output
  
imports: from typing import List
  import torch
  import torch.nn
  from ....base import BaseAEConfig
  from ....base.base_utils import ModelOutput
  from ...base_architectures import BaseDecoder, BaseEncoder
  from ..utils import ResBlock
label_desc: Use image node_id 2 for calling the Encoder_ResNet_AE_CIFAR obj's underlying member method code with example usage: obj.forward(x, output_layer_levels) and returns: output